运动会分跑道sql语句

snfeng 2012-10-25 10:52:04
1、要求同一队的尽量不分在同一个小组。这个均分就可以解决。
2、每组的预赛成绩前两名的选手必须分到3道和5道(共6道),这个不知道怎么解决。
没多少分了,请帮忙,谢谢!
表如下:
成绩表(运动员编号 对别 预赛成绩 )
...全文
189 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
汤姆克鲁斯 2012-10-25
  • 打赏
  • 举报
回复
--> 测试数据:#tb
IF OBJECT_ID('TEMPDB.DBO.#tb') IS NOT NULL DROP TABLE #tb
GO
CREATE TABLE #tb([运动员编号] INT,[对别] VARCHAR(1),[预赛成绩] INT)
INSERT #tb
SELECT 1,'a',50 UNION ALL
SELECT 2,'a',60 UNION ALL
SELECT 3,'a',70 UNION ALL
SELECT 4,'a',40 UNION ALL
SELECT 5,'a',10 UNION ALL
SELECT 6,'a',70 UNION ALL
SELECT 7,'b',10 UNION ALL
SELECT 8,'b',20 UNION ALL
SELECT 9,'b',80 UNION ALL
SELECT 10,'b',10 UNION ALL
SELECT 11,'b',60 UNION ALL
SELECT 12,'b',90
--------------开始查询--------------------------
--分组
;WITH cte AS (
SELECT *,row_id=ROW_NUMBER()OVER(PARTITION BY [对别] ORDER BY [运动员编号]) FROM #tb
)
SELECT *,组=(ROW_NUMBER()OVER( ORDER BY row_id ,[对别])+5)/6 FROM cte

--分赛道
;WITH cte AS (
SELECT *,row_id=ROW_NUMBER()OVER(PARTITION BY [对别] ORDER BY [运动员编号]) FROM #tb
)
, cte2 AS
(
SELECT *,组=(ROW_NUMBER()OVER( ORDER BY row_id ,[对别])+5)/6 FROM cte
)
,cte3 AS
(
SELECT *,row_id2=ROW_NUMBER()OVER(PARTITION BY 组 ORDER BY [预赛成绩] DESC ) FROM cte2
)
/*既然给1/2名指定了赛道,不妨给每个人都指定一个赛道,呵呵*/
SELECT *,赛道=CASE row_id2 WHEN 1 THEN 3
WHEN 2 THEN 5
WHEN 3 THEN 1
WHEN 4 THEN 2
WHEN 5 THEN 4
WHEN 6 THEN 6
END
FROM cte3
汤姆克鲁斯 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

取出每组前两名后,剩下4个人怎么分道呢?我的想法是,先均分,把每组6个人先分道(先解决同一队不在同一组),然后再修改(3道、5道不是前两名的话,调换)现在不知道怎么调换?
[/Quote]
成绩排序,然后取出来前两名分到3道、5道

剩下4个人 随机分就行了
snfeng 2012-10-25
  • 打赏
  • 举报
回复
取出每组前两名后,剩下4个人怎么分道呢?我的想法是,先均分,把每组6个人先分道(先解决同一队不在同一组),然后再修改(3道、5道不是前两名的话,调换)现在不知道怎么调换?
快溜 2012-10-25
  • 打赏
  • 举报
回复
分组排序,取出每组前两名。
汤姆克鲁斯 2012-10-25
  • 打赏
  • 举报
回复
看到算法都头晕

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧