2016-11-30 132 views
0

我試圖找到兩個數字之間的差異對應於相同的ID,但有兩個不同的條件。例如,SQL:行之間的差異

Column A Column B Column C 
1234  3   True 
1234  5   False 
5678  10  True 
5678  15  False 

所以基本上我想找到列B中的區別時,列A是相同的,但列C是不同的。

+2

對於列A中的每個不同值,總會有* atmost * 2行嗎? –

+2

如果相關,請爲數據庫和版本添加標籤。 – xQbert

回答

0

如果我們可以假設

  • 2行給定值在ColumnA
  • 預期的結果是每個獨特的可樂返回值
  • columnC永遠不會爲空只有1排...
  • B列永遠不會匹配,如果他們這樣做,你不希望返回記錄。

我們可以使用自連接檢查列A上的匹配,列C上沒有匹配,因此我們不會爲2和-2的1234分別獲得一行。

SELECT Z.ColumnA, Z.B-Y.B 
FROM TableName Z 
INNER JOIN tableName Y 
on Z.ColumnA = Y.ColumnA 
and Z.ColumnC <> Y.ColumnC 
and Z.ColumnB > Y.ColumnB 

你也可以用一個窗口函數使用lead來做這件事,然後展望下一個記錄。但我不知道你的RDBMS是否支持窗口函數。

0
select t1.ColumnA, t1.ColumnB-t2.ColumnB diff from 
tab t1, tab t2 
where t1.columnA = t2.columnA and t1.ColumnC='True' and t2.ColumnC='False' 
0

如果你的表名是myTable,我相信你可以加入表本身和Column A,然後在Column B選擇差異時Column C不等於本身。因此,像這樣

SELECT X.ColumnB - Y.ColumnB as Diff 
FROM myTable as X 
inner join 
    myTable as Y 
on X.ColumnA=Y.ColumnA 
WHERE X.ColumnC <> Y.ColumnC 
0

你可以使用一個自連接

select a.column_A, a,column_B, b.column_B, a.column_B . b.column_B 
    from my_table a 
    inner join my_column b where a.column_a = b.column_a and a.column_c <> b_column_c 
0

如果RDBMS支持窗口功能

;with cte as (
    Select * 
      ,Change = ColumnB-Lag(ColumnB,1) over (Partition By ColumnA Order By (Select null)) 
      ,TrueFalse = Lag(ColumnC,1) over (Partition By ColumnA Order By (Select null)) 
    From @YourTable 
) 
Select ColumnA 
     ,Change 
From cte 
Where Change<>0 
    and TrueFalse<>ColumnC 

返回

ColumnA Change 
1234 2 
5678 5 
0

這一個減去「真「行來自」假「ro ws,同時保留所有真正的行。

SELECT true.columna, true.columnb, COALESCE(false.columnb, 0) - true.columnb AS difference 
FROM 
(SELECT * 
FROM t 
WHERE columnc = "true") true 
LEFT JOIN 
(SELECT * 
FROM t 
WHERE columnc = "false) false 
ON true.columna = false.columna 

coalesce子句將解釋沒有錯誤行的情況。沒有它,你會最終試圖從NULL中減去。

0

如果您使用的是Oracle,請查看User Defined aggregate functions。如果您定義了一個名爲diff()的函數,那麼您可以使用select column_A, diff(column_B) from my_table group by column_A,但請記住diff的實現需要特別小心,因爲不同的排序會產生不同的結果。