数据重复时如何按组查找最小日期
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')
【讨论】:
以上是关于数据重复时如何按组查找最小日期的主要内容,如果未能解决你的问题,请参考以下文章