gpt4 book ai didi

sql - DENSE_RANK 根据特定顺序

转载 作者:行者123 更新时间:2023-12-04 11:49:37 24 4
gpt4 key购买 nike

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

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

最佳答案

您可以使用:

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值(value)。

    Demo here

    关于sql - DENSE_RANK 根据特定顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34429903/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com