首页 > 解决方案 > SQL Server - 选择最接近 30 分钟间隔的行

问题描述

我们正在使用 SQL Server 2016:

这是我当前的表:

countx  RunDateTime
104 7/15/20 0:05
104 7/15/20 0:10
102 7/15/20 0:15
102 7/15/20 0:20
100 7/15/20 0:25
100 7/15/20 0:30
102 7/15/20 0:35
99  7/15/20 0:40
97  7/15/20 0:46
99  7/15/20 0:56
93  7/15/20 1:01
93  7/15/20 1:10
93  7/15/20 1:16
91  7/15/20 1:31
89  7/15/20 1:39
87  7/15/20 1:57
88  7/15/20 2:05
80  7/15/20 2:11
81  7/15/20 2:20

我只想要以下结果

countx    RunDateTime
104   7/15/20 0:05
100   7/15/20 0:30
93    7/15/20 1:01
91    7/15/20 1:31
88    7/15/20 2:05

我怎么能只选择最接近最近的 30 分钟间隔的行?

我只想要最接近一小时和最接近半小时的行

例如,我只想要最接近的行

00:00 和 00:30

01:00 和 01:30

02:00 和 02:30

等等

我能够选择最接近小时的行,但我不知道如何获取最接近半小时的数据。这是我尝试过的。

SELECT  
       RunDateTime,
       COUNT(DISTINCT id) countxbyhour
FROM (SELECT 
            t.*, 
            MIN(RunDateTime) OVER(PARTITION BY CAST(RunDateTime AS DATE),
            DATEPART(HOUR,RunDateTime)) mintmstmp
      FROM table t) x
WHERE RunDateTime = mintmstmp
GROUP BY RunDateTime
ORDER BY RunDateTime

标签: sql-server

解决方案


基于杰森的:

declare @t table(countx int, RunDateTime datetime);
insert into @t values
(104, '7/15/20 0:05'),
(104, '7/15/20 0:10'),
(102, '7/15/20 0:15'),
(102, '7/15/20 0:20'),
(100, '7/15/20 0:25'),
(100, '7/15/20 0:30'),
(102, '7/15/20 0:35'),
(99,  '7/15/20 0:40'),
(97,  '7/15/20 0:46'),
(99,  '7/15/20 0:56'),
(93,  '7/15/20 1:01'),
(93,  '7/15/20 1:10'),
(93,  '7/15/20 1:16'),
(91,  '7/15/20 1:31'),
(89,  '7/15/20 1:39'),
(87,  '7/15/20 1:57'),
(88,  '7/15/20 2:05'),
(80,  '7/15/20 2:11'),
(81,  '7/15/20 2:20');

WITH CTE AS
(--get data and dif
select *, ROW_NUMBER() OVER (PARTITION BY (countx) ORDER BY (CASE WHEN DATEPART(MINUTE, RunDateTime) >= 30 
            THEN (DATEPART(MINUTE, RunDateTime) - 30) / 30.0
            ELSE DATEPART(MINUTE, RunDateTime) / 30.0
        END)) as rowno
from @t
)
select *
from 
    CTE
where
    CTE.rowno = 1;

推荐阅读