我试图找到两个数字之间的差异对应于相同的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