gpt4 book ai didi

sql-server - 两列上的 DENSE_RANK,其中一列是不同的值,另一列是重复的

转载 作者:行者123 更新时间:2023-12-04 16:36:45 25 4
gpt4 key购买 nike

我有以下情况,我很难理解如何应用 DENSE_RANK() 来获得我想要的结果:

<头>
身份证 日期 值(value)
1 1990-05-17 1.00
1 1991-10-12 1.00
1 1992-08-01 1.00
1 1993-07-05 0.67
1 1994-05-02 0.67
1 1995-02-01 1.00
1 1996-03-01 1.00

根据上述数据,我尝试使用 DateValue 列的组合来识别不同的时期,其中唯一时期是从Value 列从一个值更改为另一个值。这是我正在寻找的结果:

<头>
身份证 日期 值(value) 期间
1 1990-05-17 1.00 1
1 1991-10-12 1.00 1
1 1992-08-01 1.00 1
1 1993-07-05 0.67 2
1 1994-05-02 0.67 2
1 1995-02-01 1.00 3
1 1996-03-01 1.00 3

如您所见,有 3 个不同的时期。我遇到的问题是,当我使用 DENSE_RANK() 时,我会得到以下两种结果之一:

SELECT DENSE_RANK() OVER (PARTITION BY ID ORDER BY Date, Value)

<头>
身份证 日期 值(value) 期间
1 1990-05-17 1.00 1
1 1991-10-12 1.00 2
1 1992-08-01 1.00 3
1 1993-07-05 0.67 4
1 1994-05-02 0.67 5
1 1995-02-01 1.00 6
1 1996-03-01 1.00 7

SELECT DENSE_RANK() OVER (PARTITION BY ID ORDER BY Value)

<头>
身份证 日期 值(value) 期间
1 1990-05-17 1.00 1
1 1991-10-12 1.00 1
1 1992-08-01 1.00 1
1 1993-07-05 0.67 2
1 1994-05-02 0.67 2
1 1995-02-01 1.00 1
1 1996-03-01 1.00 1

如您所见,问题在于 Date 列,因为我需要将其作为累积期。此外,从 IDID 的句点数量会有所不同,并且 Date 列背后没有一致的科学依据。例如,一个成员在一年内可能有两个条目。

最佳答案

您可以使用 LAG() 窗口函数为每一行获取其先前的值,并使用 SUM() 窗口函数进行条件聚合获取 Periods:

SELECT ID, Date, Value,
SUM(CASE WHEN VALUE = prev_value THEN 0 ELSE 1 END) OVER (PARTITION BY ID ORDER BY Date) Period
FROM (
SELECT *, LAG(Value) OVER (PARTITION BY ID ORDER BY Date) prev_value
FROM tablename
) t
ORDER BY Date;

demo .

关于sql-server - 两列上的 DENSE_RANK,其中一列是不同的值,另一列是重复的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68893664/

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