SELECT语句优化

时间:2016-05-02 14:08:26

标签: sql sql-server

我在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的另一种方法。

任何帮助表示赞赏

埃托

1 个答案:

答案 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;