这是SQL查询的一部分,旨在识别是否针对特定系列触发了“Nelson Rules”(请参阅统计过程控制)。
在本节中,当前和前五个值分别为34,33,30,27,27,26,26和24时,返回“六个(或更多)点不断增加或减少”的结果。
这不是我的意图,并向我建议T-SQL将“小于”符号解释为“小于或等于”。
manage.py shell
答案 0 :(得分:0)
我已使用您提供的值快速测试您的查询。我得到了你期望的结果(即所有行都为null)。
这是一个简短的测试案例。
首先,我创建了一个包含Trucks列和日期列的表:
USE [YourDatabase]
GO
CREATE TABLE [dbo].[TrucksTable](
[Trucks] [int] NULL,
[date] [datetime] NULL
) ON [PRIMARY]
GO
然后我插入了您在问题中提到的值:
INSERT INTO TrucksTable (Trucks, [date])
VALUES
(34, '2017-06-25'),
(33, '2017-06-24'),
(30, '2017-06-23'),
(27, '2017-06-22'),
(27, '2017-06-21'),
(26, '2017-06-20'),
(26, '2017-06-19'),
(24, '2017-06-18')
最后,我针对新创建的表执行了此查询,以测试您的表达式:
SELECT
Trucks,
[date],
lag(Trucks,1) over (order by [date]) AS Lag1,
lag(Trucks,2) over (order by [date]) AS Lag2,
lag(Trucks,3) over (order by [date]) AS Lag3,
lag(Trucks,4) over (order by [date]) AS Lag4,
lag(Trucks,5) over (order by [date]) AS Lag5,
CASE
WHEN (TRUCKS<(lag(Trucks,1) over (order by [date]))
and (lag(Trucks,1) over (order by [date]) < lag(Trucks,2) over (order by [date]))
and (lag(Trucks,2) over (order by [date]) < lag(Trucks,3) over (order by [date]))
and (lag(Trucks,3) over (order by [date]) < lag(Trucks,4) over (order by [date]))
and (lag(Trucks,4) over (order by [date]) < lag(Trucks,5) over (order by [date])))
OR
(TRUCKS>(lag(Trucks,1) over (order by [date]))
and (lag(Trucks,1) over (order by [date]) > lag(Trucks,2) over (order by [date]))
and (lag(Trucks,2) over (order by [date]) > lag(Trucks,3) over (order by [date]))
and (lag(Trucks,3) over (order by [date]) > lag(Trucks,4) over (order by [date]))
and (lag(Trucks,4) over (order by [date]) > lag(Trucks,5) over (order by [date])))
THEN 'Six (or more) points continually increasing or decreasing'
ELSE NULL END AS Rule_Three
FROM TrucksTable
结果如下: Query result
由于您得到了不同的结果,我最好猜测您的[Trucks]列是近似数字数据类型,例如float或real。我建议您检查[Trucks]列的数据类型,看看是否是这种情况。