如何使用sql查询在同一列中减去两行的值?

Tal*_*Nit 4 sql

我想使用查询显示subtraction来自two不同行的两个值SQL.

这是表结构:

------------------------------------
id | name | sub1 | sub2 | date
------------------------------------
1  | ABC  | 50   | 75   | 2014-11-07
2  | PQR  | 60   | 80   | 2014-11-08  
Run Code Online (Sandbox Code Playgroud)

我想从2014-11-07之日减去日期2014-11-08主题标记.

输出应该像

| sub1  | sub2 |
 ---------------
|   10  |   5  |
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 15

您可以使用连接来获取行,然后减去值:

SELECT(t2.sub1 - t1.sub1) AS sub1, (t2.sub2 - t1.sub2) AS sub2
FROM table t1 CROSS JOIN
     table t2
WHERE t1.date = '2014-11-08' AND t2.id = '2014-11-07';
Run Code Online (Sandbox Code Playgroud)


小智 5

我觉得您正在忽略实际需求中的重要部分,您可能希望根据某些特定字段进行分组并返回相应的值,因此答案将是有限的。您可以像上面的示例一样对表进行两次引用,但是如果仅以某种方式仅引用一次表并消除了对索引查找,书签查找等的需要,通常会更好。通常可以使用简单的聚合或窗口聚合来完成这个。

SELECT
  MAX(sub1) - MIN(sub1) AS sub1, 
  MAX(sub2) - MIN(sub2) AS sub2
FROM
  dbo.someTable;
Run Code Online (Sandbox Code Playgroud)

http://sqlfiddle.com/#!6/75ccc/2


Car*_*way 5

交叉联接可能难以使用,因为它们以通常不直观的方式关联数据。下面是我将如何做到这一点,使用简单的默认值INNER JOIN

WITH day1_info AS
    (SELECT sub1, sub2
     FROM mytable)
SELECT
    day2_info.sub1 - day1_info.sub1 AS sub1_difference,
    day2_info.sub2 - day1_info.sub2 AS sub2_difference,
FROM
    mytable AS day2_info JOIN day1_info
        ON day1_info.date = '2014-11-07'
        AND day2_info.date = '2014-11-08'
Run Code Online (Sandbox Code Playgroud)

如果您想对多组日期执行此操作,您也可以这样做。只需JOIN稍微更改声明即可。(请注意,在这种情况下,您可能还需要SELECT其中一个日期,以便您知道每个结果适用于哪个时间段。)

WITH day1_info AS
    (SELECT sub1, sub2
     FROM mytable)
SELECT
    day2_info.date,
    day2_info.sub1 - day1_info.sub1 AS sub1_difference,
    day2_info.sub2 - day1_info.sub2 AS sub2_difference,
FROM
    mytable AS day2_info JOIN day1_info
        ON (day1_info.date::timestamp + '1 day') = day2_info.date::timestamp
Run Code Online (Sandbox Code Playgroud)