2015-09-11 3 views
2

я запускаю этот запрос в MSSQL, чтобы получить элементы, группируя по 7 дней в неделю:MSSQL заказ предыдущих 7 дней

SELECT COUNT(Date_Entered), DATENAME(WEEKDAY, Date_Entered) 
    FROM my_table 
    WHERE Board_Name = 'Board' 
     AND DATEDIFF(DAY,Date_Entered,GETDATE()) <= 7 
    GROUP BY DATENAME(WEEKDAY, Date_Entered) 

В результате, дни недели сортируются в алфавитном порядке : Пятница> Суббота> Суббота> Воскресенье> Четверг> Вторник> Среда

Как отсортировать по нормальному/правильному/здравому порядку, начиная с буднего дня 7 дней назад и заканчивая вчера?

+0

'DATEDIFF (DAY, Date_Entered, GETDATE()) <= 7' не является допустимым и не будет масштабироваться очень хорошо. Вы должны использовать вместо этого 'Date_Entered> = DATEADD (DAY, -7, CAST (GETDATE() AS DATE)). –

ответ

1

Сортировка по MAX(Date_Entered) должен работать тоже:

SELECT 
    COUNT(Date_Entered), 
    DATENAME(WEEKDAY, Date_Entered) 
FROM my_table 
WHERE Board_Name = 'Board' AND DATEDIFF(DAY,Date_Entered,GETDATE()) <= 7 
GROUP BY DATENAME(WEEKDAY, Date_Entered) 
ORDER BY MAX(Date_Entered); 

Обычно вы хотели бы заказать по дате по возрастанию, но так как вы используете агрегированную функцию, которую вам нужно будет группировать по дате, которая разрушит ее, но поскольку максимальная (дата) в каждой группе - это дата, которую вы можете сделать max (date) для заказа.

+0

Это работает только если у вас есть данные, покрывающие каждый день. – shawnt00

+0

@ shawnt00 Не следуйте, пожалуйста, объясните. Почему бы не работать с отсутствующими датами? – jpw

+0

Самая последняя суббота в данных могла быть три недели назад, но он все еще хочет, чтобы суббота была первой, даже если появились более свежие данные в другие дни недели. – shawnt00

1

DATEPART является вашим другом, попробуйте так:

SELECT COUNT(Date_Entered), DATENAME(WEEKDAY, Date_Entered),DATEPART(WEEKDAY,Date_Entered) 
    FROM my_table 
    WHERE Board_Name = 'Board' 
     AND DATEDIFF(DAY,Date_Entered,GETDATE()) <= 7 
    GROUP BY DATEPART(WEEKDAY,Date_Entered),DATENAME(WEEKDAY, Date_Entered) 
ORDER BY DATEPART(WEEKDAY,Date_Entered) 
0

Если вы не можете рассчитывать на доступность данных за каждую неделю, вам нужно будет сделать что-то более основанное на расчетах по дате. С верхней части моей головы, я думаю, что это будет более надежным:

ORDER BY (DATEDIFF(dd, MAX(Date_Entered), CURRENT_TIMESTAMP) + 77777) % 7 

EDIT: я написал, что не понимая, что данные уже ограничены одной недели. Я думал, что намерение состояло в том, чтобы группировать в ведрах по дням недели для более длинного диапазона дат.

Я также прокомментирую, что для меня более естественно делать группировку на cast(Date_Entered as date), а не на строковое значение, и я не удивлюсь, если это более эффективный запрос.

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