我想比较行中的数字数据。例如,我有一个有这样一列的表: -
Number
======
1.88
9.99
8.76
9.88
我想将第二个值,第三个值,第四个值与第一个值进行比较。然后是第3,第4个值到第2个。然后是第4到第3。
我如何构建一个sql来做到这一点?
答案 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)