我試圖找到兩個數字之間的差異對應於相同的ID,但有兩個不同的條件。例如,SQL:行之間的差異
Column A Column B Column C
1234 3 True
1234 5 False
5678 10 True
5678 15 False
所以基本上我想找到列B中的區別時,列A是相同的,但列C是不同的。
我試圖找到兩個數字之間的差異對應於相同的ID,但有兩個不同的條件。例如,SQL:行之間的差異
Column A Column B Column C
1234 3 True
1234 5 False
5678 10 True
5678 15 False
所以基本上我想找到列B中的區別時,列A是相同的,但列C是不同的。
如果我們可以假設
我們可以使用自連接檢查列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是否支持窗口函數。
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'
如果你的表名是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
你可以使用一個自連接
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
如果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
這一個減去「真「行來自」假「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中減去。
如果您使用的是Oracle,請查看User Defined aggregate functions。如果您定義了一個名爲diff()
的函數,那麼您可以使用select column_A, diff(column_B) from my_table group by column_A
,但請記住diff的實現需要特別小心,因爲不同的排序會產生不同的結果。
對於列A中的每個不同值,總會有* atmost * 2行嗎? –
如果相關,請爲數據庫和版本添加標籤。 – xQbert