TSQL获取每个人和他的号码的最大和最小日期
Posted
技术标签:
【中文标题】TSQL获取每个人和他的号码的最大和最小日期【英文标题】:TSQL getting the maximum and minimum date for each person and his number 【发布时间】:2020-02-19 14:11:53 【问题描述】:我有一个这样的数据集:
需要从每一帧中获取最小和最大日期、人物和他的号码:
下面的代码示例:enter link description here
非常感谢!
【问题讨论】:
那么是什么阻止了你?你试过什么?为什么它不起作用? 对不起,我不小心加错截图了。 别管截图了,这里的大多数人都想要格式化的文本,而不是图像。 我投票决定将此问题作为题外话结束,因为需求文档不是问题。 【参考方案1】:这看起来像是一个间隙和岛的问题。这是使用窗口函数解决它的一种方法:
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
【讨论】:
【参考方案2】:这是一个间隙和孤岛问题的示例。我会为此推荐行号的差异:
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)
【讨论】:
以上是关于TSQL获取每个人和他的号码的最大和最小日期的主要内容,如果未能解决你的问题,请参考以下文章