2016-08-22 4 views
2

Как получить данные, когда «самый большой день» недели не существует?Как получить «самый большой день» в неделю?

Например, если в моей базе данных нет в течение одной недели (при условии, что суббота и воскресенье не в моей базе данных), я все равно хочу получать данные с четверга. Если оба пятница и четверг не существуют, я хотел бы получить данные из среды и т.д.

Это то, что я в настоящее время (этот код позволяет мне получить в последний день месяца из моей базы данных):

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

Я также понимаю, что вы можете использовать функцию DATEPART для получения всех данных с определенного дня (например, в пятницу), то, что я не уверен в том, как получить четверг, если пятница не существует. Я ищу, чтобы захватить все данные, которые имеют соответствующие функции, а не одну конкретную неделю. Благодаря!

Как яркий пример: Скажем, у меня есть четыре входных данных в моем database->
1. 2016/8/19 (пт), красный
2. 2016/8/18 (чт), синий
3. 2016/8/11 (чт), красный
4. 2016/8/10 (ср), красный
после того, как запрос выполняется, я хотел бы иметь:
1. 2016/8/19 (Пт), красный
3. 2016/8/11 (Thu), красный
Они выбраны, потому что эти данные являются соответствующими «самыми большими» данными на этой неделе.

+0

Не могли бы вы показать некоторые примеры данных с ожидаемыми результатами – TheGameiswar

+0

я считаю, имеющий календарную таблицу. – jarlh

+0

выберите с max с DATEPART (dw, GETDATE()) и сгруппируйте по DATEPART (wk, DATECOLUMN). Добавьте другие столбцы по мере необходимости на выбор. –

ответ

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 
+0

он отлично работает, очень ценится! – ragehulk

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 
+0

работает как шарм, спасибо! – ragehulk

Смежные вопросы