我正在寻找一个每天只能返回一条记录的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之间存储的。
很高兴能得到一些帮助;非常感谢
答案 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获得时间,然后按日期范围限制并培训公司代码