Получить результат в SQL за последние 12 месяцев, начиная с текущей даты - PullRequest
0 голосов
/ 19 марта 2020

Итак, я пытаюсь получить данные из моей БД за последние 12 месяцев. У меня очень большая хранимая процедура, в которой я сначала рассчитал данные, не зависящие от временного интервала Во-первых, на моем SP я вычисляю один контейнер, где я получаю некоторые данные, такие как год, месяц, идентификатор и т. Д. c. Остальные расчеты основаны на этих данных (id, месяц, год).

Теперь мой начальник решил рассчитывать только данные только за последние 12 месяцев. Но я не могу сосредоточиться на этом. Я думал о создании рекурсивного CTE (Common Table Expression), где я вычисляю только последние 12 месяцев. Может быть, у вас, ребята, другое мнение. Позвольте мне показать вам мой начальный запрос. :

SELECT DISTINCT Year, Month, BId, DCode, ParentB_ID AS [PId]
  FROM [s].SK k
  join Businesses b on b.id = k.BId
  left join AD d on k.BId = d.DID
  WHERE SName = 'New Test'

Этот запрос возвращает мне это:

Year Month  BId   DCode  PId
---- -----  ----  -----  ---
2018  12    12    NULL   NULL
2018  12    20    NULL   1
2018  12    33    NULL   26
2018  12    19    NULL   20

То, что предполагается вернуть сейчас, это только данные из год = 2019 и месяц = ​​3 до сих пор.

Я пытался сделать следующее:

;WITH ACCC  
  AS
  (
        SELECT DISTINCT Year, Month, BId, d.DCode, P_ID AS [ParentId]
        FROM [s].SK k
        join Businesses b on b.id = k.BId
        left join AD d on k.BId = d.D_ID
        WHERE SName = 'New Test' 
        //AND add here the logic for selecting data only for the last 12 months. 
        //Starting from current and ascending

          CROSS JOIN

        SELECT DISTINCT Year, Month, BId, d.DCode, P_ID AS [ParentId]
        FROM [s].SK s
        INNER JOIN   ACCC P
        ON P.BId = s.D_ID
  )
  SELECT Year, Month, BId, d.DCode, P_ID AS [ParentId]
  FROM AC

Я на правильном пути с этим CTE. Есть ли другой путь?

Я действительно борюсь с этим парнем. Любая помощь, я был бы очень признателен. Заранее большое спасибо:)

1 Ответ

0 голосов
/ 20 марта 2020

Если у вас уже есть год и месяц, вы можете отфильтровать последние 12 месяцев следующим образом:

(это T-SQL / SQL Server)

IF OBJECT_ID('tempdb..#Foo') IS NOT NULL DROP TABLE #Foo;

CREATE TABLE #Foo (
    [Year] INT NOT NULL,
    [Month] INT NOT NULL,
    Bar VARCHAR(20)
);

INSERT INTO #Foo([Year], [Month], Bar) VALUES (2018, 1, 'NO');
INSERT INTO #Foo([Year], [Month], Bar) VALUES (2018, 12, 'NO');
INSERT INTO #Foo([Year], [Month], Bar) VALUES (2019, 1, 'NO');
INSERT INTO #Foo([Year], [Month], Bar) VALUES (2019, 2, 'NO');
INSERT INTO #Foo([Year], [Month], Bar) VALUES (2019, 3, 'YES');
INSERT INTO #Foo([Year], [Month], Bar) VALUES (2019, 4, 'YES');
INSERT INTO #Foo([Year], [Month], Bar) VALUES (2019, 5, 'YES');
INSERT INTO #Foo([Year], [Month], Bar) VALUES (2019, 12, 'YES');
INSERT INTO #Foo([Year], [Month], Bar) VALUES (2020, 1, 'YES');
INSERT INTO #Foo([Year], [Month], Bar) VALUES (2020, 2, 'YES');
INSERT INTO #Foo([Year], [Month], Bar) VALUES (2020, 3, 'YES');

SELECT  [Year], [Month], Bar
FROM    #Foo
WHERE   [Year] > YEAR(DATEADD(YEAR, -1, GETDATE()))
        OR ([Year] = YEAR(DATEADD(YEAR, -1, GETDATE())) 
            AND [Month] >= MONTH(DATEADD(YEAR, -1, GETDATE())))
...