2016-11-30 186 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的实现需要特别小心,因为不同的排序会产生不同的结果。