从 table 计算数据序列
Calculating the sequence of data from a table
我有一个 table 是从一些 sql 生成的。我需要从中进一步获得以下规则,但被卡住了,非常感谢您的帮助。
对于每 3 个连续的周期,添加天数。
当前的table是在SQL的更复杂的计算版本上推导出来的,以生成table,下面是它的基础:
SELECT Cycle, Days
FROM Leave
当前 Table:
- Cycle: 1,2,3,4,5,6,7,8
- Days: 7,8,7,6,9,5,4,9
期望的结果
虽然你没有提到你的DBMS名称,但以下是MSSQL和MySQL的2个解决方案。如果您有其他 DBMS,您也可以应用相同的逻辑。
MSSQL:
SELECT
CAST(A.cycle AS VARCHAR)
+','+ CAST(B.cycle AS VARCHAR)
+','+ CAST(C.cycle AS VARCHAR) Cycles,
A.days+B.days+C.days Days
FROM your_table A
CROSS APPLY your_table B
CROSS APPLY your_table C
WHERE C.cycle = B.cycle+1 AND B.cycle = A.cycle+1
ORDER BY A.cycle
MySQL:
SELECT
CONCAT(CAST(A.cycle AS CHAR)
,',', CAST(B.cycle AS CHAR)
,',', CAST(C.cycle AS CHAR)) Cycles,
A.days+B.days+C.days Days
FROM your_table A
CROSS JOIN your_table B
CROSS JOIN your_table C
WHERE C.cycle = B.cycle+1 AND B.cycle = A.cycle+1
ORDER BY A.cycle;
您可以使用累计和:
select t.*,
sum(days) over (order by cycle rows between 2 preceding and current row)
from t;
注意:对于前两行,您将得到的值不是三天的总和。处理此问题的一种方法是使用 lag()
代替:
select t.*,
(days +
lag(days, 1) over (order by cycle) +
lag(days, 2) over (order by cycle)
)
from t;
前两行 return NULL
。
我有一个 table 是从一些 sql 生成的。我需要从中进一步获得以下规则,但被卡住了,非常感谢您的帮助。
对于每 3 个连续的周期,添加天数。
当前的table是在SQL的更复杂的计算版本上推导出来的,以生成table,下面是它的基础:
SELECT Cycle, Days
FROM Leave
当前 Table:
- Cycle: 1,2,3,4,5,6,7,8
- Days: 7,8,7,6,9,5,4,9
期望的结果
虽然你没有提到你的DBMS名称,但以下是MSSQL和MySQL的2个解决方案。如果您有其他 DBMS,您也可以应用相同的逻辑。
MSSQL:
SELECT
CAST(A.cycle AS VARCHAR)
+','+ CAST(B.cycle AS VARCHAR)
+','+ CAST(C.cycle AS VARCHAR) Cycles,
A.days+B.days+C.days Days
FROM your_table A
CROSS APPLY your_table B
CROSS APPLY your_table C
WHERE C.cycle = B.cycle+1 AND B.cycle = A.cycle+1
ORDER BY A.cycle
MySQL:
SELECT
CONCAT(CAST(A.cycle AS CHAR)
,',', CAST(B.cycle AS CHAR)
,',', CAST(C.cycle AS CHAR)) Cycles,
A.days+B.days+C.days Days
FROM your_table A
CROSS JOIN your_table B
CROSS JOIN your_table C
WHERE C.cycle = B.cycle+1 AND B.cycle = A.cycle+1
ORDER BY A.cycle;
您可以使用累计和:
select t.*,
sum(days) over (order by cycle rows between 2 preceding and current row)
from t;
注意:对于前两行,您将得到的值不是三天的总和。处理此问题的一种方法是使用 lag()
代替:
select t.*,
(days +
lag(days, 1) over (order by cycle) +
lag(days, 2) over (order by cycle)
)
from t;
前两行 return NULL
。