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获取每个人和他的号码的最大和最小日期的主要内容,如果未能解决你的问题,请参考以下文章

获取csv中每个日期的最小和最大日期时间

从熊猫数据框中获取最小和最大日期

获取日期范围之间每一行的最小和最大日期时间

从Awk中的多维数组中的子数组获取最小值和最大值

查找每个 ID 的特定日期之前的最大日期和特定日期之后的最小日期 [关闭]

用于创建具有数据框中每个日期的最小值和最大值的表的函数