所以我试图从最近的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的正确专家吗?还有其他办法吗?
我真的很努力地与这些家伙。任何帮助,我将不胜感激。预先非常感谢:)
如果您已经有了年和月,则可以像下面这样过滤过去的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())))