您好我有一个数据表我想根据排序日期顺序从第一组名称开始输出名称的dense_rank。 e.g。
DROP TABLE MyTable
SELECT * INTO MyTable FROM (
VALUES ('2015-12-23', 'ccc'),('2015-12-21', 'aaa'),
('2015-12-20', 'bbb'),('2015-12-22', 'aaa')
) t (date, name)
SELECT DENSE_RANK() OVER (ORDER BY name) rank, * FROM MyTable ORDER BY date
对于上面的查询,我得到了
rank date name
2 2015-12-20 bbb
1 2015-12-21 aaa
1 2015-12-22 aaa
3 2015-12-23 ccc
您可以看到日期已排序(好),排名分配给组中的名称(好),但排名不是从第一组名称开始,例如我想要
rank date name
1 2015-12-20 bbb
2 2015-12-21 aaa
2 2015-12-22 aaa
3 2015-12-23 ccc
您如何更正查询?如果有多个工作答案,将选择最简单/最短的答案作为答案。感谢。
感谢@ lad2025和@GiorgosBetsos澄清我的问题。根据日期和日期排序是直的,在我的情况下是独特的。名称可以重复并且不连续出现。因此,对于('2015-12-24', 'aaa')
,输出为
rank date name
1 2015-12-20 bbb
2 2015-12-21 aaa
2 2015-12-22 aaa
3 2015-12-23 ccc
4 2015-12-24 aaa
答案 0 :(得分:3)
首先按日期排序不同的名称,然后加入表格:
;WITH cte AS(SELECT name, ROW_NUMBER() OVER(ORDER BY MIN(date)) rn
FROM dbo.MyTable
GROUP BY name)
SELECT c.rn, m.date, m.name
FROM cte c
JOIN dbo.MyTable m ON m.name = c.name
ORDER BY m.date
答案 1 :(得分:2)
您可以使用:
SELECT DENSE_RANK() OVER (ORDER BY minGrpDate),
[date], name
FROM (
SELECT MIN([date]) OVER (PARTITION BY grp) AS minGrpDate,
[date], name
FROM (
SELECT [date], name,
ROW_NUMBER() OVER (ORDER BY [date])
-
ROW_NUMBER() OVER (PARTITION BY name ORDER BY [date]) AS grp
FROM mytable) AS t ) AS s
ORDER BY Date
<强>解释强>
grp
字段标识具有相同name
的连续记录的岛屿。 minGrpDate
,使用grp
计算,是每个岛屿的最短日期。minGrpDate
我们现在可以应用DENSE_RANK()
来获得所需的排名。 注1:以上查询处理name
字段中的不连续性,即非连续字段具有相同名称的情况。
注2:该查询不会处理共享相同name
值的不同date
值的情况。