数据重复时如何按组查找最小日期
How can I find the min date by group when data repeats
所以,我的问题如下。
我有一个带有时间戳(日期和时间)的数据集。我有另一个显示文件状态的字段,该状态应该从一个阶段流向下一个阶段,但有时它会循环回到前一个阶段。发生这种情况时,我需要显示发生此更改时的时间戳。
例如,我需要知道 'Instructed' 中某个项目的最小日期,这很好,我有这个。然后我需要知道的是,如果文件移动到 'Non Instructed' 并再次返回到 'Instructed',这里的 MIN 时间戳是多少 - 即示例中的 07/01/2020,因此有效地忽略了之前的任何内容文件最后一次处于 'Non Instructed' 阶段。这个循环可能会发生多次,我总是需要为处于 'Instructed' 状态的文件显示最近的 MIN 日期。我正在使用 MS SQL 服务器。
如果我没看错的话,你可以用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')
这被称为间隙和孤岛问题。
由于为示例数据提供了图像,我还没有对此进行测试,但我相信这会起作用:
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;
所以,我的问题如下。
我有一个带有时间戳(日期和时间)的数据集。我有另一个显示文件状态的字段,该状态应该从一个阶段流向下一个阶段,但有时它会循环回到前一个阶段。发生这种情况时,我需要显示发生此更改时的时间戳。
例如,我需要知道 'Instructed' 中某个项目的最小日期,这很好,我有这个。然后我需要知道的是,如果文件移动到 'Non Instructed' 并再次返回到 'Instructed',这里的 MIN 时间戳是多少 - 即示例中的 07/01/2020,因此有效地忽略了之前的任何内容文件最后一次处于 'Non Instructed' 阶段。这个循环可能会发生多次,我总是需要为处于 'Instructed' 状态的文件显示最近的 MIN 日期。我正在使用 MS SQL 服务器。
如果我没看错的话,你可以用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')
这被称为间隙和孤岛问题。
由于为示例数据提供了图像,我还没有对此进行测试,但我相信这会起作用:
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;