如果系列打破了数据顺序,我想在升序/降序系列中选择最小值和最大值
假设我有按 DateTime 排序的数据:
LogDate StartValue EndValue Multiplier DiffValue
2016-02-08 7661.25 7677.62 6.94 16.37
2016-02-09 7677.62 7693.02 6.94 15.4
2016-02-10 7693.02 7709.82 6.94 16.8
2016-02-11 7709.82 7727.08 6.94 17.26
2016-02-12 7727.08 7740.93 6.94 13.85
2016-02-13 3.02 12.22 6.94 9.2
2016-02-14 12.22 20.73 6.94 8.51
2016-02-15 20.73 37.04 6.94 16.31
2016-02-16 37.04 52.56 7 15.52
2016-02-17 52.56 67.82 7 15.26
2016-02-18 67.82 83.66 7 15.84
2016-02-19 83.66 98.77 7 15.11
2016-02-20 98.77 108.37 7 9.61
我想要这样的结果:
LogDateMin LogDateMax StartValue EndValue Multiplier SumOfDiffValue
2016-02-08 2016-02-12 7661.25 7740.93 6.94 79.68
2016-02-13 2016-02-15 3.02 37.04 6.94 34.02
2016-02-16 2016-02-20 37.04 108.37 7 71.34
这里我还按乘数对结果进行分组并获取 deffValue 的总和
我们怎样才能实现这个目标
请帮忙
最佳答案
对于 SQL Server 2012 及更高版本,您可以使用 LAG
来计算更改并按其进行分组。这是一种方法;
WITH cte AS (
SELECT LogDate, StartValue, EndValue, Multiplier, DiffValue,
LAG(EndValue) OVER (ORDER BY LogDate) OldEndValue,
LAG(Multiplier) OVER (ORDER BY LogDate) OldMultiplier
FROM myTable
), cte2 AS (
SELECT LogDate, StartValue, EndValue, Multiplier, DiffValue,
SUM(CASE WHEN OldEndValue > StartValue OR Multiplier <> OldMultiplier
THEN 1 ELSE 0 END) OVER (ORDER BY LogDate) grp
FROM cte
)
SELECT MIN(LogDate) LogDateMin, MAX(LogDate) LogDateMax, MIN(StartValue) StartValue,
MAX(EndValue) EndValue, MAX(Multiplier) Multiplier, SUM(DiffValue) DiffValue
FROM cte2
GROUP BY grp
ORDER BY MIN(LogDate);
第一个 CTE 只是将 EndValue
和 Multiplier
的先前值添加到每行。
第二个 CTE 对 case 语句进行运行求和,以检测您想要的更改。
主语句按运行总和(每次更改都会增加)进行分组并计算您需要的值。
关于sql - SQL 第 2 部分中按中断系列升序/降序对结果最小值/最大值进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36147965/