Лучшая практика в сценарии

В настоящее время я пытаюсь сделать следующее:

получить последний уик-штамп за последние 6 месяцев, ниже показано, как может выглядеть конечный результат:

Month  | Weekstamp |
2013-12| 2013-52   |
2014-01| 2014-05   |

.... и так далее

У меня есть вспомогательная таблица, в которой есть все недели и которая позволяет мне подключаться к таблице календарей, которая, в свою очередь, содержит все месяцы, что означает, что я могу получать все недельные отметки в месяц,

но как я могу получить все номера прошлой недели за последние 6 месяцев? моя идея была временной таблицей некоторого вида (никогда не использовал, я новичок, когда дело доходит до SQL), которая вычисляет все Weekstamp, которые должны быть отфильтрованы в месяц, и затем выдает только те значения, которые я мог бы использовать для фильтрации запрос, который содержит все данные, которые мне нужны.

У кого-нибудь есть идея получше?

Как я уже сказал, я только начинающий, поэтому я не могу сказать, какой будет лучший способ

Заранее большое спасибо!

1 ответ

Я предполагаю, что ваша задача - определить последние шесть месяцев. Для этого вы можете использовать таблицу подсчета (spt_values) и DateDiff, чтобы определить, когда наступают последние шесть месяцев.

Вы также можете в зависимости от того, какая БД и версия легко сделать это без таблицы календарей или недель.

это

WITH rnge 
     AS (SELECT number 
         FROM   master..spt_values 
         WHERE  type = 'P' 
                AND number > 0 
                AND number < 7), 
     dates 
     AS (SELECT EOMONTH(Dateadd(m, number * -1, Getdate())) dt 
         FROM   rnge) 
SELECT Year(dt)         year, 
       Month(dt)        month, 
       Datepart(wk, dt) week 
FROM   dates 

Производит этот вывод

| YEAR | MONTH | WEEK |
|------|-------|------|
| 2014 |     1 |    5 |
| 2013 |    12 |   53 |
| 2013 |    11 |   48 |
| 2013 |    10 |   44 |
| 2013 |     9 |   40 |
| 2013 |     8 |   35 |

демонстрация

Я оставлю это вам для форматирования значений

Предполагается, что SQL Server 2012 использует EOMONTH, см. Раздел Получение последнего дня месяца в SQL для предыдущих версий SQL Server.

Другие вопросы по тегам