sql - SQL 第 2 部分中按中断系列升序/降序对结果最小值/最大值进行分组

标签 sql sql-server

如果系列打破了数据顺序,我想在升序/降序系列中选择最小值和最大值

假设我有按 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 只是将 EndValueMultiplier 的先前值添加到每行。

第二个 CTE 对 case 语句进行运行求和,以检测您想要的更改。

主语句按运行总和(每次更改都会增加)进行分组并计算您需要的值。

关于sql - SQL 第 2 部分中按中断系列升序/降序对结果最小值/最大值进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36147965/

相关文章:

c# - SQL Server - 如何选择每个用户的最新记录?

sql - 获取最近的非空记录

sql - 将 SQL Server 数据库移动到新服务器

sql - 根据计算值选择,优化

sql - 将日期范围与一组日期范围 SQL 进行比较

sql - 如何高效查询每个类别的 n 条记录

mysql - SQL使用其他表+一个值获取数据

mysql - 删除表的重复项

mysql - 即使其中一个表为空,SELECT 也返回行

sql - 在 SQL 中循环 SELECT 结果集