7

嗨,我有一个数据表,我想根据排序的日期顺序从第一组名称开始输出名称的 dense_rank。例如

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
4

2 回答 2

4

您可以使用:

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值的情况。

演示在这里

于 2015-12-23T07:10:29.360 回答
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
于 2015-12-23T06:43:03.633 回答