从当前日期开始的最近12个月中在SQL中获取结果集

问题描述 投票:0回答:1

所以我试图从最近的12个月中从数据库中获取数据。我有一个很大的存储过程,在该过程中我首先不依赖时间跨度来计算数据。首先,在我的SP上,我计算了一个容器,在该容器中我获得了诸如年,月,id等的一些数据。其他计算基于这些数据(id,月,年)。

现在,我的老板决定只计算过去12个月的数据。但是我无法解决这个问题。我当时正在考虑创建一个递归CTE(公用表表达式),在那里我只计算最近的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

现在应该返回的只是从year = 2019,month = 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的正确专家吗?还有其他办法吗?

我真的很努力地与这些家伙。任何帮助,我将不胜感激。预先非常感谢:)

sql database recursion recursive-query
1个回答
0
投票

如果您已经有了年和月,则可以像下面这样过滤过去的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())))
© www.soinside.com 2019 - 2024. All rights reserved.