如何在一周内获得“最大的一天”?

时间:2016-08-22 08:51:27

标签: sql sql-server

如果一周中“最大的一天”不存在,如何获取数据?

例如,如果星期五在我的数据库中不存在特定的一周(假设星期六和星期日不在我的数据库中),我仍然希望能够从星期四获得数据。如果周五和周四都不存在,我想从星期三等获得数据。

这是我目前拥有的(此代码允许我从我的数据库中获取该月的最后一天):

/**Select Last Day Of Month**/
SELECT * FROM [mytable]
WHERE [date] IN (SELECT MAX([date])
FROM [mytable]
GROUP BY MONTH([Date]), YEAR([Date]))    

我也明白你可以使用DATEPART函数来获取特定日期(即星期五)的所有数据,我不确定的是如果周五不存在则如何获得星期四。我想抓住所有具有相应功能的数据,而不是一个特定的周。谢谢!

更清楚的例子: 假设我的数据库中有四个输入数据 - >
1. 2016/8/19(星期五),红色 2. 2016/8/18(星期四),蓝色
3. 2016/8/11(星期四),红色
4. 2016/8/10(周三),红色
执行查询后,我希望:
1. 2016/8/19(星期五),红色 3. 2016/8/11(星期四),红色
之所以选择它们,是因为这两个数据是该周内相应的“最大”数据。

2 个答案:

答案 0 :(得分:4)

查看以下查询是否有帮助。它显示给定输入数据中每周的最后一天。

declare @table table(
date datetime
)

insert into @table
values
('08/01/2016'),
('08/02/2016'),
('08/03/2016'),
('08/04/2016'),
('08/05/2016'),
('08/06/2016'),
('08/07/2016'),
('08/08/2016'),
('08/09/2016'),
('08/10/2016'),
('08/11/2016'),
('08/12/2016'),
('08/13/2016'),
('08/14/2016'),
('08/15/2016'),
('08/16/2016'),
('08/17/2016'),
('08/18/2016'),
('08/19/2016'),
('08/20/2016'),
('08/21/2016'),
('08/22/2016'),
('08/23/2016')


;with cte as
(
select date, row_number() over(partition by datepart(year,date),datepart(week,date) order by date desc) as rn from @table
)

select date,datename(weekday,date) from cte
where rn = 1

答案 1 :(得分:1)

您可以提取各种早期部分并构建合适的ROW_NUMBER()表达式。

E.g。以下内容将行号1分配给每周内的最后一天:

ROW_NUMBER() OVER (
PARTITION BY DATEPART(year,[date]),DATEPART(week,[date])
ORDER BY DATEPART(weekday,[date]) DESC) as rn