SQL:行之间的差异

时间:2016-11-30 19:08:07

标签: sql

我试图找到对应于相同ID但具有两个不同条件的两个数字之间的差异。例如,

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

所以基本上我想找到列B中的差异,当列A相同但列C不同时。

7 个答案:

答案 0 :(得分:0)

如果我们可以假设

  • ColumnA
  • 中给定值的2行
  • 预期结果每个唯一colA值只返回1行
  • columnC永远不会为null ...
  • B栏永远不会匹配,如果他们这样做,你就不希望记录被退回。

我们可以使用自我联接检查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的实现需要特别小心,因为不同的排序会产生不同的结果。