2014-11-08 65 views
3

我想要使用SQL查詢來顯示來自two不同行的兩個值的subtraction如何使用sql查詢減去同一列內的兩行值?

這是表結構:

------------------------------------ 
id | name | sub1 | sub2 | date 
------------------------------------ 
1 | ABC | 50 | 75 | 2014-11-07 
2 | PQR | 60 | 80 | 2014-11-08 

我想從日期2014年11月7日減去日期2014年11月8日主題標記。

輸出應該是這樣的

| sub1 | sub2 | 
--------------- 
| 10 | 5 | 

回答

12

您可以使用一個連接來獲取行,然後減去值:

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'; 
0

我覺得你要離開了的一個重要組成部分您的實際需要,您可能希望按某個特定字段進行分組並返回相應的值,因此答案會有限。您可以像上面的例子一樣對錶進行雙引用,但是如果您只能以某種方式只引用一次表並刪除對索引查找,書籤查找等的需要,通常會好得多。通常可以使用簡單聚合或窗口聚合來完成這個。

SELECT 
    MAX(sub1) - MIN(sub1) AS sub1, 
    MAX(sub2) - MIN(sub2) AS sub2 
FROM 
    dbo.someTable; 

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

1

交叉連接可以是很難,因爲它們涉及的方式,通常是直觀的數據來工作。下面是我會怎麼做它,而不是,用簡單的,默認情況下,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' 

如果你想多套日期做到這一點,你可以做到這一點。只需稍微更改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