数据重复时如何按组查找最小日期

Posted

技术标签:

【中文标题】数据重复时如何按组查找最小日期【英文标题】:How can I find the min date by group when data repeats 【发布时间】:2020-09-30 09:09:38 【问题描述】:

所以,我的问题如下。

我有一个带有时间戳(日期和时间)的数据集。我有另一个显示文件状态的字段,这个状态应该从一个阶段流向下一个阶段,但偶尔它会循环回到前一个阶段。发生这种情况时,我需要显示此更改发生的时间戳。

例如,我需要知道“指示”中的项目时的 MIN 日期,这很好,我有这个。然后我需要知道的是,如果文件移动到“非指示”并再次回到“指示”,这里的最小时间戳是什么 - 即示例中的 07/01/2020,因此有效地忽略了上次之前的任何内容文件处于“非指示”阶段。这个循环可能会发生多次,我总是需要显示处于“指示”状态的文件的最近 MIN 日期。我正在使用 MS SQL Server。

【问题讨论】:

【参考方案1】:

这被称为间隙和孤岛问题。

由于为示例数据提供了图像,我没有对此进行测试,但我不怀疑这会起作用:

WITH Grps AS(
    SELECT AuditTimeStamp,
           Stamp,
           ROW_NUMBER() OVER (ORDER BY AuditTimeStamp) -
           ROW_NUMBER() OVER (PARTITION BY Stage ORDER BY AuditTimeStamp) AS Grp
    FROM dbo.YourTable)
SELECT MIN(AuditTimeStamp) AS MinAuditTimeStamp,
       Stamp
FROM Grps
GROUP BY Stamp,
         Grp
ORDER BY MinAuditTimeStamp ASC;

【讨论】:

【参考方案2】:

如果我没听错,你可以使用lag()

select t.*
from (
    select t.*, lag(stage) over(order by audit_timestamp) lag_stage
    from mytable t
) t
where stage = 'Instructed' and (lag_stage is null or lag_stage <> 'Instructed')

【讨论】:

以上是关于数据重复时如何按组查找最小日期的主要内容,如果未能解决你的问题,请参考以下文章

按组划分的最常见值(模式)[重复]

在具有重复行的 SQL Server 表中按组查找行号

按组将数据框日期拆分为单个最小最大日期范围

在数据框中按组折叠文本[重复]

按组和列之间查找最小值

如何查找数据库中的重复数据