也许有人可以帮助我。我一直在尝试创建一个查询来总结一个项目的时间量低于阈值。我的数据是这样的:SQL Server计算总时间低于阈值
我试图发现NR列小于或等于5的阈值的最后日期。我的数据如下图表中最好的可视化:
一个的情况下,最后一点是上述5所以这不会给的值。 B在2017年2月8日等于或低于阈值,并且C永远不在上面。在这种情况下,我会使用第一个系列赛(盘旋)。
我创建的代码几乎让我得到答案。请注意,代码中的最后一步是计算从低于阈值的点到低于阈值的最后一点的数据差异。例如在B中 - 这将是2017年2月8日至2017年2月28日期间的差异。
代码是:
IF OBJECT_ID('tempdb.dbo.#TAB', 'U') IS NOT NULL
DROP TABLE #TAB;
CREATE TABLE #TAB (SL VARCHAR(5), NR FLOAT, Date Date)
INSERT INTO #TAB VALUES
('A', '10', '1/1/2017'),
('A', '4', '1/15/2017'),
('A', '12', '2/1/2017'),
('A', '4', '2/7/2017'),
('A', '3', '2/15/2017'),
('A', '6', '2/28/2017'),
('B', '10', '1/1/2017'),
('B', '8' ,'1/15/2017'),
('B', '7' ,'2/1/2017'),
('B', '5', '2/7/2017'),
('B', '4', '2/15/2017'),
('B', '4' ,'2/28/2017'),
('C', '4', '1/1/2017'),
('C', '4', '1/15/2017'),
('C', '3' ,'2/1/2017'),
('C', '3', '2/7/2017'),
('C', '3' ,'2/15/2017'),
('C' ,'2', '2/28/2017')
;WITH CTE1 AS(
SELECT *, ROW_NUMBER() OVER (PARTITION BY SL ORDER BY Date) Rn_ix FROM [#TAB])
,
CTE2 AS
(
SELECT
CTE1.SL,
NR,
CTE1.Date Max_Date
FROM CTE1 INNER JOIN (SELECT MAX(Date) Date, SL FROM CTE1 GROUP BY SL) NEW ON CTE1.Date = NEW.Date AND CTE1.SL = NEW.SL
)
,
CTE3 AS
(
SELECT
CTe1.SL,
MIN(Date) Sample_date_Max,
MAX(Rn_IX) as Max_Row_Number,
CTE2.Max_Date
FROM CTE1 INNER JOIN CTE2 ON CTE1.SL = CTE2.SL
WHERE CTE1.NR <= 5
GROUP BY CTE1.SL, CTE2.Max_Date
)
,
CTE4 AS
(
SELECT SL, MAX(Date) as SampleDate, MAX(Rn_ix) Rn_IX
FROM CTE1 WHERE NR >5 GROUP BY SL
),
CTE5 AS
(SELECT CTE1.SL, CTe1.Date, NR
FROM CTE4
INNER JOIN CTE1 ON CTE4.Rn_IX = CTE1.Rn_ix-1
and CTE4.SL = CTe1.SL)
SELECT
CTe2.SL,
DATEDIFF(WEEK, CTE5.Date, CTE2.Max_Date) as Weeks_Under,
ISNULL(CTE5.NR, CTE2.NR) AS NumericResult
FROM CTE5 FULL OUTER JOIN CTE2 ON CTE2.SL = CTE5.SL
ORDER BY CTE2.SL
这给了我以下结果:
B是正确的 - 它已经跌破5 3周和第一个结果值,它越过后是5. A是正确的 - 目前的价值低于5。它下降,但回到上面。数字结果是最新值 C不正确 - C始终低于5,我希望在数字结果中看到该系列的第一个值(本例中为01/01/2017,本例中为4),而在第类别下数周。
总之我想要最近一段时间低于或等于5和相应的数字结果。
输出应该是这样的:
我真的很感激有这方面的帮助。如果这个问题措辞不当,请事先道歉。
在此先感谢!
惊人!谢谢。从来没有想过使用交叉应用 - 这仍然让我困惑了一下。感谢您的帮助 - 这是惊人的 - 效果很好 –