繁体   English   中英

SQL:从具有特定值的连续行中减去

[英]SQL: Subtract from consecutive rows with specific value

我有一个像下面这样的表:

+------+-----+------+-------+
|  ID  | day | time | count |
+------+-----+------+-------+
| abc1 |   1 |   12 |     1 |
| abc1 |   1 |   13 |     3 |
| abc1 |   2 |   14 |     2 |
| abc2 |   2 |   18 |     4 |
| abc2 |   2 |   19 |     8 |
| abc2 |   3 |   15 |     3 |
+------+-----+------+-------+

我想要做的是从下一行中减去“计数”,如果ID相同,则日期与当前行具有相同的值,并且时间大于值(例如+1)。 所以我想得到的新表有这样的布局:

+------+-----+------+-------+------------+
|  ID  | day | time | count | difference |
+------+-----+------+-------+------------+
| abc1 |   1 |   12 |     1 | 2          |
| abc1 |   1 |   13 |     3 | null       |
| abc1 |   2 |   14 |     2 | null       |
| abc2 |   2 |   18 |     4 | 4          |
| abc2 |   2 |   19 |     8 | null       |
| abc2 |   3 |   15 |     3 | null       |
+------+-----+------+-------+------------+

正如您所看到的那样,只有具有相同ID的行,每天和时间差为1。

您可以使用以下使用LEAD窗口函数的查询:

SELECT ID, day, time, count,
       CASE WHEN lTime - time = 1 THEN lCount - count
            ELSE NULL
       END as difference 
FROM (
  SELECT ID, day, time, count,
         LEAD(time) OVER w AS lTime,
         LEAD(count) OVER w AS lCount
  FROM mytable  
  WINDOW w AS (PARTITION BY ID, day ORDER BY time) ) t

上面的查询使用相同的窗口两次,以获取同一分区中一条记录的值。 外部查询使用这些下一个值来强制执行要求。

在这里演示

在看到您的示例数据和预期输出后,我建议使用左连接,如下所示:

SELECT a.*,
       b.count - a.count
FROM   MyTable a
       LEFT JOIN MyTable b
              ON a.ID = b.ID
                 AND a.time = b.time - 1
                 AND a.count < b.count 

注意:如果有两行或更多行符合连接条件,则它将显示多行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM