SQL: 你如何根据非连续日期进行第二次分组?
SQL: How do you make a second grouping based off non-sequential dates?
我正在使用 SQL Server 2008 R2。我有 table 名为 Name 的结构和示例数据:
ID Date Name DOD
10001 200911 Kevin H 06/17/2000
10001 200912 Kevin 06/20/2000
10001 201001 Kevin 06/20/2000
10001 201012 K 06/20/2000
10001 201101 K 06/20/2000
10001 201406 Kevin 06/20/2000
请注意,随着时间的推移,员工 10001 已更改名称 3 次,更改 DOD 一次。我想要做的是按 ID、名称和 DOD 分组,以便数据在日期之间保持一致。我还需要获取这些组的最小和最大日期,并确保日期按顺序排列。如果名称或 DOD 发生变化,然后又变回原来的状态,则需要创建一个新组。
因此,输出将如下所示:
EmployeeID MinDate MaxDate Name DOD
10001 200911 200911 Kevin H 06/17/2000
10001 200912 201001 Kevin 06/20/2000
10001 201012 201101 K 06/20/2000
10001 201406 201406 Kevin 06/20/2000
名称 table 非常大,因此会出现数据在 20 个月内保持一致,然后在 1 个月内不一致,然后在 20 个月内恢复一致的情况。
提前致谢,如果您需要更多信息,请告诉我。
您可以使用不同的行号方法:
select employeeid, min(date) as mindate, max(date) as maxdate,
name, dod
from (select t.*,
row_number() over (partition by employeeid order by date) as seqnum_d,
row_number() over (partition by employeeid, name, dod order by date) as seqnum_dnd
from t
) t
group by employeeid, (seqnum_d - seqnum_dnd);
要查看其工作原理,运行 子查询。如果你盯着结果看一会儿,你就会明白为什么行号的差异在这种情况下有效。
我正在使用 SQL Server 2008 R2。我有 table 名为 Name 的结构和示例数据:
ID Date Name DOD
10001 200911 Kevin H 06/17/2000
10001 200912 Kevin 06/20/2000
10001 201001 Kevin 06/20/2000
10001 201012 K 06/20/2000
10001 201101 K 06/20/2000
10001 201406 Kevin 06/20/2000
请注意,随着时间的推移,员工 10001 已更改名称 3 次,更改 DOD 一次。我想要做的是按 ID、名称和 DOD 分组,以便数据在日期之间保持一致。我还需要获取这些组的最小和最大日期,并确保日期按顺序排列。如果名称或 DOD 发生变化,然后又变回原来的状态,则需要创建一个新组。
因此,输出将如下所示:
EmployeeID MinDate MaxDate Name DOD
10001 200911 200911 Kevin H 06/17/2000
10001 200912 201001 Kevin 06/20/2000
10001 201012 201101 K 06/20/2000
10001 201406 201406 Kevin 06/20/2000
名称 table 非常大,因此会出现数据在 20 个月内保持一致,然后在 1 个月内不一致,然后在 20 个月内恢复一致的情况。
提前致谢,如果您需要更多信息,请告诉我。
您可以使用不同的行号方法:
select employeeid, min(date) as mindate, max(date) as maxdate,
name, dod
from (select t.*,
row_number() over (partition by employeeid order by date) as seqnum_d,
row_number() over (partition by employeeid, name, dod order by date) as seqnum_dnd
from t
) t
group by employeeid, (seqnum_d - seqnum_dnd);
要查看其工作原理,运行 子查询。如果你盯着结果看一会儿,你就会明白为什么行号的差异在这种情况下有效。