使用顺序处理功能,如LAG 和LEAD,顺序是最重要的维护因素,也是原始帖子中遗漏的一项。在 SQL Server 中,窗口函数将在其自己的分区(分组)和排序标准上运行,因此在可视化关联数据时,在外部查询中使用与窗口函数相同的标准非常重要。
可以在这个小提琴中探索以下解决方案:http://sqlfiddle.com/#!18/5e1ee/31
要验证您的输入条件,请运行查询以输出 LAG 和 LEAD 结果:
SELECT
[Id],[Order]
, LAG (ORDER_BASIS, 1, NULL) OVER (ORDER BY [Id]) AS PREV_BASIS
, [Order_Basis]
, LEAD (ORDER_BASIS, 1, NULL) OVER (ORDER BY [Id]) AS NEXT_BASIS
FROM DATA_TABLE;
| Id |
Order |
PREV_BASIS |
Order_Basis |
NEXT_BASIS |
| 1 |
INCREASING |
(null) |
8 |
16 |
| 2 |
INCREASING |
8 |
16 |
12 |
| 3 |
INCREASING |
16 |
12 |
5 |
| 4 |
INCREASING |
12 |
5 |
1 |
| 5 |
INCREASING |
5 |
1 |
1 |
| 6 |
INCREASING |
1 |
1 |
10 |
| 7 |
INCREASING |
1 |
10 |
16 |
| 8 |
INCREASING |
10 |
16 |
16 |
| 9 |
INCREASING |
16 |
16 |
(null) |
下一个问题是您尝试的逻辑使用LAG AND LEAD 值,这不是无效的,但通常用于计算 平滑的值走出曲线或试图检测尖峰或高点和低点。
没有必要通过 CTE 执行此操作,但它简化了此讨论的语法的可读性,在 CTE 中我们也可以执行整数转换,但是在生产环境中存储ORDER_BASIS 列首先是一个整数。
WITH Records as
(
SELECT
[Id],[Order]
, CAST(LAG (ORDER_BASIS, 1, NULL) OVER (ORDER BY [Id]) AS INT) AS PREV_BASIS
, CAST([Order_Basis] AS INT) AS [Order_Basis]
, CAST(LEAD (ORDER_BASIS, 1, NULL) OVER (ORDER BY [Id]) AS INT) AS NEXT_BASIS
FROM DATA_TABLE
)
SELECT
[Id],[Order],PREV_BASIS,[Order_Basis],NEXT_BASIS
,CASE
WHEN NEXT_BASIS > ORDER_BASIS AND PREV_BASIS > ORDER_BASIS THEN 'LOW'
WHEN NEXT_BASIS < ORDER_BASIS AND PREV_BASIS < ORDER_BASIS THEN 'HIGH'
WHEN ISNULL(PREV_BASIS, ORDER_BASIS) = ORDER_BASIS THEN 'NO CHANGE'
WHEN ISNULL(PREV_BASIS, ORDER_BASIS) >= ORDER_BASIS
AND ISNULL(NEXT_BASIS, ORDER_BASIS) <= ORDER_BASIS
THEN 'DECREASING'
WHEN ISNULL(PREV_BASIS, ORDER_BASIS) <= ORDER_BASIS
AND ISNULL(NEXT_BASIS, ORDER_BASIS) >= ORDER_BASIS
THEN 'INCREASING'
ELSE 'INDETERMINATE'
END AS CORRECT_ORDER
FROM Records
ORDER BY [Id];
| Id |
Order |
PREV_BASIS |
Order_Basis |
NEXT_BASIS |
CORRECT_ORDER |
| 1 |
INCREASING |
(null) |
8 |
16 |
NO CHANGE |
| 2 |
INCREASING |
8 |
16 |
12 |
HIGH |
| 3 |
INCREASING |
16 |
12 |
5 |
DECREASING |
| 4 |
INCREASING |
12 |
5 |
1 |
DECREASING |
| 5 |
INCREASING |
5 |
1 |
1 |
DECREASING |
| 6 |
INCREASING |
1 |
1 |
10 |
NO CHANGE |
| 7 |
INCREASING |
1 |
10 |
16 |
INCREASING |
| 8 |
INCREASING |
10 |
16 |
16 |
INCREASING |
| 9 |
INCREASING |
16 |
16 |
(null) |
NO CHANGE |
您可以通过再次使用LAG 比较来确定上述记录集中间的NO CHANGE 是否实际上是较长时期内的低点。 p>
如果CORRECT ORDER 应该只是上一条记录的函数,那么根本不需要使用LEAD 评估:
WITH Records as
(
SELECT
[ID],[ORDER]
, CAST(LAG (ORDER_BASIS, 1, NULL) OVER (ORDER BY [Id]) AS INT) AS PREV_BASIS
, CAST([ORDER_BASIS] AS INT) AS [ORDER_BASIS]
FROM DATA_TABLE
)
SELECT
[ID],[ORDER],[PREV_BASIS],[ORDER_BASIS]
, CASE WHEN ORDER_BASIS < PREV_BASIS
THEN 'DECREASING'
WHEN ORDER_BASIS > PREV_BASIS
THEN 'INCREASING'
ELSE 'NO CHANGE'
END CORRECT_ORDER
FROM Records;
| ID |
ORDER |
PREV_BASIS |
ORDER_BASIS |
CORRECT_ORDER |
| 1 |
INCREASING |
(null) |
8 |
NO CHANGE |
| 2 |
INCREASING |
8 |
16 |
INCREASING |
| 3 |
INCREASING |
16 |
12 |
DECREASING |
| 4 |
INCREASING |
12 |
5 |
DECREASING |
| 5 |
INCREASING |
5 |
1 |
DECREASING |
| 6 |
INCREASING |
1 |
1 |
NO CHANGE |
| 7 |
INCREASING |
1 |
10 |
INCREASING |
| 8 |
INCREASING |
10 |
16 |
INCREASING |
| 9 |
INCREASING |
16 |
16 |
NO CHANGE |