SQL qn: - 比较行中的数据

时间:2009-09-25 03:15:46

标签: sql compare

我想比较行中的数字数据。例如,我有一个有这样一列的表: -

Number
======
 1.88
 9.99
 8.76
 9.88

我想将第二个值,第三个值,第四个值与第一个值进行比较。然后是第3,第4个值到第2个。然后是第4到第3。

我如何构建一个sql来做到这一点?

3 个答案:

答案 0 :(得分:1)

不确定这个实用程序,但也许这就是你要找的...... 比较值的更简单方法是使用ORDER BY子句。

我冒昧地在表中添加了一个id列,我称之为tblTst。这样可以方便地选择一些特定的值(参见(...)子句中的WHERE id),并且它还用于避免交叉积中的重复。要比较整个表,只需省略WHERE子句。连接条件可以更改为严格小于(<)以防止将值与自身进行比较(只是方便测试我的'=')

表格中有100个值,矩阵的底部(或顶部)三角形将包含5,000个比较。 (再一次,我很困惑这个如何有用或有趣......)

select T1.value AS Operand1,
     CASE WHEN T1.Value < T2.Value THEN '<'
          WHEN T1.Value = T2.Value Then '='
          ELSE '>'
     END AS Comp,
     T2.Value AS Operand2
FROM tblTst T1
JOIN tblTst T2 ON T1.id <= T2.id
WHERE T1.id in (1,2,3,4)

Sample output     
Operand1 Comp  Operand2
1.88    =   1.88
1.88    <   9.99
1.88    <   8.76
1.88    <   9.88
9.99    =   9.99
9.99    >   8.76
9.99    >   9.88
8.76    =   8.76
8.76    <   9.88
9.88    =   9.88

答案 1 :(得分:1)

您需要有一些方法为行分配序列号。

考虑下表:

seq  number
---  ------
  1    1.88
  2    9.99
  3    8.76
  4    9.88

创建时:

drop table a;
commit;
create table a (seq integer,num float);                                     
insert into a (seq,num) values (1,1.88);
insert into a (seq,num) values (2,9.99);
insert into a (seq,num) values (3,8.76);
insert into a (seq,num) values (4,9.88);
commit;                                 

然后您可以执行:

select
    ta.seq as aseq,
    tb.seq as bseq,
    ta.num as anum,
    tb.num as bnum,
    ta.num - tb.num as diff
from a ta, a tb
where tb.seq > ta.seq;

会给你:

aseq  bseq  anum  bnum   diff
----  ----  ----  ----  -----
   1     2  1.88  9.99  -8.11
   1     3  1.88  8.76  -6.88
   1     4  1.88  9.88  -8.00
   2     3  9.99  8.76   1.23
   2     4  9.99  9.88   0.11
   3     4  8.76  9.88  -1.12

答案 2 :(得分:0)

为了理解,简单地将@ paxdiablo的工作简化为t-sql用语:


declare @t table 
(
    id integer identity (1, 1)
)
-- sample data
insert @t default values
insert @t default values
insert @t default values
insert @t default values

select
    a.id as a_id,
    b.id as b_id
from 
    @t as a 
cross join 
    @t as b
where 
    a.id < b.id
order by
    1, 2

给出


a_id        b_id
----------- -----------
1           2
1           3
1           4
2           3
2           4
3           4

(6 row(s) affected)