TSQL 获取每个人的最大和最小日期及其编号
TSQL getting the maximum and minimum date for each person and his number
我有这样的数据集:
需要从每一帧中获取最小和最大日期,人和他的号码:
下面的代码示例:enter link description here
非常感谢!
这是一个缺口和孤岛问题的例子。为此,我建议使用不同的行号:
select person, number_one, count(*) as cnt,
min(person_date), max(person_date)
from (select t.*,
row_number() over (partition by person order by person_date) as seqnum,
row_number() over (partition by person, number_one order by person_date) as seqnum_2
from t
) t
group by person, (seqnum - seqnum_2)
这看起来像是一个空隙和孤岛问题。这是使用 window 函数解决它的一种方法:
select
min(person_date) person_date_start,
max(person_date) person_date_end,
person,
number_one
from (
select
t.*,
row_number() over(order by person_date) rn1,
row_number() over(partition by person, number_one order by person_date) rn2
from mytable t
) t
group by person, number_one, rn1 - rn2
很不清楚在外部查询中生成 id
的逻辑是什么。如果你想重新编号记录,那么你可以使用row_number()
:
select
row_number() over(order by min(person_date)) id,
min(person_date) person_date_start,
max(person_date) person_date_end,
person,
number_one
我有这样的数据集:
需要从每一帧中获取最小和最大日期,人和他的号码:
下面的代码示例:enter link description here
非常感谢!
这是一个缺口和孤岛问题的例子。为此,我建议使用不同的行号:
select person, number_one, count(*) as cnt,
min(person_date), max(person_date)
from (select t.*,
row_number() over (partition by person order by person_date) as seqnum,
row_number() over (partition by person, number_one order by person_date) as seqnum_2
from t
) t
group by person, (seqnum - seqnum_2)
这看起来像是一个空隙和孤岛问题。这是使用 window 函数解决它的一种方法:
select
min(person_date) person_date_start,
max(person_date) person_date_end,
person,
number_one
from (
select
t.*,
row_number() over(order by person_date) rn1,
row_number() over(partition by person, number_one order by person_date) rn2
from mytable t
) t
group by person, number_one, rn1 - rn2
很不清楚在外部查询中生成 id
的逻辑是什么。如果你想重新编号记录,那么你可以使用row_number()
:
select
row_number() over(order by min(person_date)) id,
min(person_date) person_date_start,
max(person_date) person_date_end,
person,
number_one