SQL:如何查询每小时只选择第一行?

时间:2017-06-12 07:29:09

标签: sql sql-server select

我试图找到如何从每分钟记录数据到数据库的录制设备中选择每小时的第一行。

我的示例数据:

Val     Date_time
1734618 2017-06-09 14:01:04
1734609 2017-06-09 14:00:05
1734601 2017-06-09 13:59:04
1734593 2017-06-09 13:58:04
...
1734127 2017-06-09 13:02:04
1734119 2017-06-09 13:01:04
1734111 2017-06-09 13:00:05
1734103 2017-06-09 12:59:04

我的问题是我不知道如何每小时仅查询时间数据的第一行,而且我不知道为什么我不能在 Microsoft SQL中使用DATE_FORMAT()函数服务器管理自动完成文本中没有此功能。我发现这个因为没有DATE_FORMAT()函数而每分钟选择它对我不起作用。

SELECT * 
FROM table 
WHERE Date_time IN ( SELECT MIN(Date_time) AS Date_time
              FROM table
              GROUP BY DATE_FORMAT(Date_time,'%Y-%m-%d %H:%i'))

我的示例输出:2行

Val     Date_time
1734609 2017-06-09 14:00:05
1734111 2017-06-09 13:00:05

任何想法请帮助先生? 非常感谢你的帮助。

编辑:使用FORMAT()函数可以正常工作。

5 个答案:

答案 0 :(得分:2)

不要使用使用子选择的解决方案,性能会受到影响,上面的当前4个示例会随着时间的推移给你一个不正确的结果(尝试添加1734618,'2017-05-09 14:01:04')。这种方法更有效:

Boolean

答案 1 :(得分:0)

试试这个

select *
from table t1 inner join 
(select min(Date_time) as minDate_time from table 
group by convert(date,Date_time),CONVERT(VARCHAR(2),  Date_time, 114)) t2 
on t.Date_time= t2.minDate_time

答案 2 :(得分:0)

这应该做:

SELECT * 
FROM table 
WHERE table.Date_time IN 
( SELECT MIN(table.Date_time) AS Date_time
  FROM table 
  GROUP BY cast(table.Date_time as DATE), DatePart(HOUR,table.Date_time)
)

答案 3 :(得分:0)

SELECT * 
FROM table
WHERE Date_time IN ( 

 SELECT MIN(Date_time) 
 FROM table
 GROUP BY CONVERT(VARCHAR(8), Date_time, 112), DATEPART(HOUR,Date_time)

)

它适用于你。

答案 4 :(得分:0)

;With cte(Val,Date_time)
AS
(
SELECT 1734618,'2017-06-09 14:01:04' Union all
SELECT 1734609,'2017-06-09 14:00:05' Union all
SELECT 1734601,'2017-06-09 13:59:04' Union all
SELECT 1734593,'2017-06-09 13:58:04' Union all
SELECT 1734127,'2017-06-09 13:02:04' Union all
SELECT 1734119,'2017-06-09 13:01:04' Union all
SELECT 1734111,'2017-06-09 13:00:05' Union all
SELECT 1734103,'2017-06-09 12:59:04' 
)
SELECT Val,Date_time2 As Date_time FROM
(
SELECT Val,CASE WHEN DATEDIFF(HOUR,LagDate_time,Date_time)=1 Then Date_time ELSE NUll END AS Date_time2
From
(
SELECT *,Lag(Date_time, 1) OVER (ORDER BY Date_time,Val DESC) AS LagDate_time
FROM cte )
 Dt ) 
 )Dt2
WHERE Dt2.Date_time2 IS NOT NULL
ORDER BY Dt2.Date_time2 DESC

输出

Val     Date_time
1734609 2017-06-09 14:00:05
1734111 2017-06-09 13:00:05