我在SQL查询方面不是那么擅长,但是甚至不是一个完整的新手。
我使用SQL查询将数据从MS-SQL数据库导出到excel文件
我导出了很多列,其中两列包含日期和小时,这是我用于WHERE子句的列。
详细地说,我每天大约有200行,每个人都有不同的小时,很多天。我需要在每天的15:00之后提取第一个值更多天
由于每天的时间不同,我无法指定类似
SELECT a,b,hour,day FROM table WHERE hour='15:01'
因为有时值是15:01,有时是15:03等等(我在15:00之后寻找最接近的值),为了解决这个问题,我使用了这个解决方法:
SELECT TOP 1 a,b,hour,day FROM table WHERE hour > "15:00"
通过这种方式,我可以在15:00之后获取第一个值一天......问题是我需要更多天...用户指定的天数间隔。目前我使用UNION ALL
语句修复此问题,如下所示:
SELECT TOP 1 a,b,hour,day FROM table WHERE data="first_day" AND hour > "15:00"
UNION ALL SELECT TOP 1 a,b,hour,day FROM table WHERE data="second_day" AND hour > "15:00"
UNION ALL SELECT TOP 1 a,b,hour,day FROM table WHERE data="third_day" AND hour > "15:00"
...等所有日子(我在指定的时间间隔内为每个日构建带有的SQL字符串)。
到目前为止,这有效,但现在我需要将天数间隔(现在是一周最长,所以5天)扩展到最多60天。我不想构建一个巨大的查询字符串,但我无法想象编写SQL的另一种方法。
任何帮助表示赞赏
埃托
答案 0 :(得分:2)
我使用row_number()
的典型解决方案:
SELECT a, b, hour, day
FROM (SELECT t.*,
ROW_NUMBER() OVER (PARTITION BY day ORDER BY hour) as seqnum
FROM table t
WHERE hour > '15:00'
) t
WHERE seqnum = 1;