sql server—sql中棘手的分区

gstyhher  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(399)

我有一张这样的table

  1. RID ID DTE FLAG AMT SUMAMT
  2. 1 1 2020-07-03 02:52:15.480 Y 10 NULL
  3. 2 1 2020-07-04 02:52:15.480 N 10 NULL
  4. 3 1 2020-07-05 02:52:15.480 N 10 NULL
  5. 4 1 2020-07-06 02:52:15.480 Y 10 NULL
  6. 5 1 2020-07-13 02:52:15.480 Y 10 NULL
  7. 6 2 2020-07-06 02:52:15.480 N 10 NULL
  8. 7 2 2020-07-13 02:52:15.480 Y 10 NULL

我需要这样的结果

  1. RID ID DTE FLAG AMT SUMAMT
  2. 1 1 2020-07-03 02:52:15.480 Y 10 10
  3. 2 1 2020-07-04 02:52:15.480 N 10 NULL
  4. 3 1 2020-07-05 02:52:15.480 N 10 NULL
  5. 4 1 2020-07-06 02:52:15.480 Y 10 30
  6. 5 1 2020-07-13 02:52:15.480 Y 10 10
  7. 6 2 2020-07-06 02:52:15.480 N 10 NULL
  8. 7 2 2020-07-13 02:52:15.480 Y 10 20

我在这里需要做的就是更新“y”标志行项目的sumamt列。这里的条件是,每当我们找到“y”标志时,我们需要根据dte检查过去是否有任何“n”标志的行项目,如果有,我们需要取该行项目的金额,并需要汇总和更新金额。

  1. SELECT RID,ID,DTE,FLAG,AMT,SUM(AMT) OVER (PARTITION BY ID ORDER BY ID,DTE) FROM #T

我试过上面的查询,它是给运行总数,我不明白如何使一个分区像下面提到的。。。

  1. RID ID DTE FLAG AMT SUMAMT
  2. 1 1 2020-07-03 02:52:15.480 Y 10 10
  3. 2 1 2020-07-04 02:52:15.480 N 10 NULL
  4. 3 1 2020-07-05 02:52:15.480 N 10 NULL
  5. 4 1 2020-07-06 02:52:15.480 Y 10 30
  6. 5 1 2020-07-13 02:52:15.480 Y 10 10
  7. 6 2 2020-07-06 02:52:15.480 N 10 NULL
  8. 7 2 2020-07-13 02:52:15.480 Y 10 20

查询以创建表并插入数据。。。

  1. CREATE TABLE #T
  2. (
  3. RID INT IDENTITY(1, 1),
  4. ID INT,
  5. DTE DATETIME,
  6. FLAG VARCHAR(1),
  7. AMT INT,
  8. SUMAMT INT
  9. )
  10. INSERT INTO #T (ID, DTE, FLAG, AMT)
  11. VALUES (1, GETDATE() - 10, 'Y', 10),
  12. (1, GETDATE() - 9, 'N', 10),
  13. (1, GETDATE() - 8, 'N', 10),
  14. (1, GETDATE() - 7, 'Y', 10),
  15. (1, GETDATE(), 'Y', 10),
  16. (2, GETDATE() - 7, 'N', 10),
  17. (2, GETDATE(), 'Y', 10)
r3i60tvu

r3i60tvu1#

谢谢你的样本数据。这很有帮助。
在下面的查询中,我们将数据分为两部分:
标记“y”
标记'n'
现在,我们计算落在两个“y”标志之间的标志“n”的所有行的总和。对于标志“n”行,没有计算。

  1. SELECT t.RID, t.id, t.dte, t.amt,t.flag, isnull(t.amt+ot.sum_amt,amt)
  2. from
  3. (SELECT
  4. RID,ID, DTE, ISNULL(LAG(DTE,1) OVER(PARTITION BY ID ORDER BY DTE),'19000101') AS Prev_Yes
  5. , DTE as Current_Yes
  6. ,amt
  7. ,flag
  8. FROM #t as cr WHERE Flag = 'Y') as t
  9. OUTER APPLY
  10. (SELECT SUM(AMT) FROM #t
  11. WHERE flag = 'N'
  12. AND DTE > t.Prev_Yes AND DTE < t.Current_Yes
  13. and ID = t.id) as ot(sum_amt)
  14. UNION ALL
  15. SELECT RID, id, dte, amt,flag, NULL AS SUM_AMT
  16. FROM #t
  17. WHERE flag = 'N'
  18. ORDER BY rid
  1. +-----+----+-------------------------+-----+------+------------------+
  2. | RID | id | dte | amt | flag | (No column name) |
  3. +-----+----+-------------------------+-----+------+------------------+
  4. | 1 | 1 | 2020-07-03 09:35:10.513 | 10 | Y | 10 |
  5. | 2 | 1 | 2020-07-04 09:35:10.513 | 10 | N | NULL |
  6. | 3 | 1 | 2020-07-05 09:35:10.513 | 10 | N | NULL |
  7. | 4 | 1 | 2020-07-06 09:35:10.513 | 10 | Y | 30 |
  8. | 5 | 1 | 2020-07-13 09:35:10.513 | 10 | Y | 10 |
  9. | 6 | 2 | 2020-07-06 09:35:10.513 | 10 | N | NULL |
  10. | 7 | 2 | 2020-07-13 09:35:10.513 | 10 | Y | 20 |
  11. +-----+----+-------------------------+-----+------+------------------+
展开查看全部

相关问题