我试图找到对应于相同ID但具有两个不同条件的两个数字之间的差异。例如,
Column A Column B Column C
1234 3 True
1234 5 False
5678 10 True
5678 15 False
所以基本上我想找到列B中的差异,当列A相同但列C不同时。
答案 0 :(得分:0)
如果我们可以假设
我们可以使用自我联接检查A列上的匹配,C列上没有匹配,因此我们不会为1234和2中的每一行获得一行。
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
您也可以使用带有铅的窗口功能执行此操作,并查看下一条记录。但我不知道你的RDBMS是否支持窗口函数。
答案 1 :(得分: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'
答案 2 :(得分: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
答案 3 :(得分: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
答案 4 :(得分: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
答案 5 :(得分:0)
这个减去&#34; true&#34;来自&#34; false&#34;的行行,同时保留所有真行。
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中减去。
答案 6 :(得分:0)
如果您正在使用Oracle,请查看orbit chart。如果您定义了一个名为rsync: failed to open files-from file <(ssh -i /root/.ssh/id_rsa root@hostA find /Data/for_mk/* -type f -cmin -160): No such file or directory
rsync error: syntax or usage error (code 1) at main.c(1435) [client=3.0.9]
的函数,那么您可以使用diff()
,但请记住,diff的实现需要特别小心,因为不同的排序会产生不同的结果。