TSQL每天获取一定时间的行

时间:2015-09-22 14:26:29

标签: sql tsql networking

我正在寻找一个每天只能返回一条记录的TSQL查询;例如,如果我有以下数据,我想在每天的01:59:00返回条目;请注意,我真的不想提供秒,因为它有时可能是01:59:03或类似的东西,所以最好是01:59

id      snapshotTime            name            code    total   onTime
1       2015-09-22 02:01:01     GB Railfreight  54      0       0
2       2015-09-22 02:00:01     GB Railfreight  54      0       0
3       2015-09-22 01:59:00     GB Railfreight  54      78      70
4       2015-09-21 02:01:01     GB Railfreight  54      0       0
5       2015-09-21 02:00:01     GB Railfreight  54      0       0
6       2015-09-21 01:59:00     GB Railfreight  54      72      68

我想要的结果看起来像这样

id      snapshotTime            name            code    total   onTime
3       2015-09-22 01:59:00     GB Railfreight  54      78      70
6       2015-09-21 01:59:00     GB Railfreight  54      72      68

所以我每天只有一行,只有最后一个条目,在这种情况下,最后一个条目在1:59添加,然后在2:00重置另一天结果。这些数据来自网络轨道,因此我不能在午夜获得价值;因为数据是在第二天02:00到02:00之间存储的。

很高兴能得到一些帮助;非常感谢

4 个答案:

答案 0 :(得分:2)

如果我理解正确的话。你只想回到每一天。每天02:00:00之前发生的任何记录。

请参阅下面的工作示例,了解如何执行此操作。此示例考虑了可能有多个记录发生在01:59:XX的情况下采用输入的最后一个记录:

IF OBJECT_ID('RailTimes', 'U') IS NOT NULL
    DROP TABLE RailTimes

GO


CREATE TABLE RailTimes (
    Id INT,
    SnapshotTime DATETIME
)


INSERT RailTimes (Id, SnapshotTime)
    VALUES (1, '21 september 2015 02:00:00')
    , (2, '21 september 2015 01:59:02')
    , (3, '21 september 2015 01:59:05')
    , (4, '22 september 2015 01:59:00')
    , (5, '22 september 2015 02:00:02')

SELECT
    *
FROM (SELECT
    *,
    ROW_NUMBER() OVER (PARTITION BY DATEADD(D, 0, DATEDIFF(D, 0, SnapshotTime)) ORDER BY SnapshotTime DESC) MostRecentSnapshot
FROM RailTimes
WHERE DATEPART(HOUR, SnapshotTime) < 2) SnapShotTimes
WHERE MostRecentSnapshot = 1

ROW_NUMBER()函数基本上是通过使用以下分区将每一天分组(将每个快照时间转换为00:00:00的时间,以便我们可以将这些日期分组在一起):

DATEADD(D, 0, DATEDIFF(D, 0, SnapshotTime)) 

然后按DATETIME排序(最近时间排在第一位)。然后,WHERE子句仅返回在02:00:00之前发生的那些。

在外部查询中,我们说只返回最近的快照时间:

WHERE MostRecentSnapshot = 1

因此,在我的示例中,您可以看到21st September 2015。标识为3的行的返回时间为01:59:05,因为它最近发生。

答案 1 :(得分:1)

您可以使用row_number()

执行此操作
select t.*
from (select t.*,
             row_number() over (partition by cast(dateadd(hour, -2, snapshotTime) as date)
                                order by snapshotTime desc
                               ) as seqnum
      from table t
     ) t
where seqnum = 1;

“技巧”是从快照时间中减去两个小时并提取日期组件。

答案 2 :(得分:1)

SELECT TOP(1) WITH TIES
    id,
    CAST(snapshotTime AS smalldatetime) AS snapshotTime,
    name,
    code,
    total,
    onTime
FROM RailTimes
ORDER BY
    ROW_NUMBER() OVER
        (PARTITION BY CAST(snapshotTime AS date) ORDER BY snapshotTime);

答案 3 :(得分:0)

我很好地使用了这个

SELECT * FROM OperatorRTPPM
WHERE CONVERT(varchar(5),snapshotTime, 108) = '01:59'
AND snapshotTime > '2015-09-20' AND snapshotTime < DATEADD(d, 1, '2015-09-22 02:00')
AND code = 54

重要的是在01:59获得时间,然后按日期范围限制并培训公司代码