2016-01-13 119 views
2

我有一个SQL查询:如何选择日期范围第一和最后一个数据

WITH Cte AS 
(
    SELECT DateTime, 

     rn1 = ROW_NUMBER() OVER(ORDER BY DateTime ASC), 
     rn2 = ROW_NUMBER() OVER(ORDER BY DateTime DESC) 
    FROM 
     Test 
    WHERE 
     Username = 'ME' 
     AND DateTime > '2016-01-05' 
     AND DateTime < '2016-01-06' 
) 
SELECT * FROM Cte WHERE rn1 = 1 UNION ALL 
SELECT * FROM Cte WHERE rn2 = 1 

与此查询我成功地获得在第一个和最后一个数据2016

1月5日,但我怎样才能得到第一个和最后一个数据,例如,从1月5日1月8日

也就是说,我想从1月5日开始获取第一个和最后一个数据,然后是1月6日的第一个数据和最后一个数据,然后是1月7日的第一个数据和最后一个数据,最后是第一个数据和最后一个数据数据来自1月8日。

UPDATE
enter image description here

,你可以看到,顺序是那种乱
的,我希望它看起来像这样

enter image description here

+0

尝试增加'PARTITION BY CAST(日期时间AS DATE)''的OVER'子句。 –

+0

thnks,这就是我所喜欢的,也许你可以把它作为回答,所以我可以接受它 –

+0

完成。看到我的答案。 –

回答

2

为了让每一天的第一个和最后一个数据从1月5日至8日,您需要在OVER条款中添加PARTITION BY

WITH Cte AS(
    SELECT 
     DateTime, 
     rn1 = ROW_NUMBER() OVER(PARTITION BY CAST(DateTime AS DATE) ORDER BY DateTime ASC), 
     rn2 = ROW_NUMBER() OVER(PARTITION BY CAST(DateTime AS DATE) ORDER BY DateTime DESC) 
    FROM Test 
    WHERE 
     Username = 'ME' 
     AND DateTime >= '20160105' 
     AND DateTime < '20160109' 
) 
SELECT * FROM Cte WHERE rn1 = 1 OR rn2 = 1 

编辑:

WITH Cte AS(
    SELECT 
     CAST(DateTime AS DATE), 
     DateTime, 
     rn1 = ROW_NUMBER() OVER(PARTITION BY CAST(DateTime AS DATE) ORDER BY DateTime ASC), 
     rn2 = ROW_NUMBER() OVER(PARTITION BY CAST(DateTime AS DATE) ORDER BY DateTime DESC) 
    FROM Test 
    WHERE 
     Username = 'ME' 
     AND DateTime >= '20160105' 
     AND DateTime < '20160109' 
) 
SELECT * FROM Cte WHERE rn1 = 1 OR rn2 = 1 
ORDER BY CAST(DateTime AS DATE) 
+0

通过使用此查询,如果日期范围只有2或3天,这是很好的,但如果范围约1个月,行是一团糟,有什么办法,所以数据可以按日期? –

+0

您可以在'SELECT'中添加'(CAST DateTime AS DATE)'。 –

+0

我在我的问题中添加了图片,显示了混乱,我尝试使用Cast,并且没有运气 –

相关问题