【问题标题】:SQL qn:- comparing data in rowsSQL qn:- 比较行中的数据
【发布时间】:2015-11-18 02:13:08
【问题描述】:

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

Number
======
 1.88
 9.99
 8.76
 9.88

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

我怎样才能构造一个 sql 来做到这一点?

【问题讨论】:

  • 我尝试转置这些值,然后我想做一个 case 语句来比较每个值。但这将是巨大的,因为我至少有 100 多个值。我还尝试使用相同的数字列内部加入表,然后减去 column1 和 column2 以比较哪个值更大。但是逻辑并不完全适用,因为下一个比较省略了前面的值。 IE。在比较第 2、3、4 和第 1 值之后。下一个比较是第 3 和第 4 与第 2。有什么想法吗?

标签: sql compare


【解决方案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】:

不确定它的实用性,但也许这就是您正在寻找的... 比较值的一种更简单的方法是使用 ORDER BY 子句。

我冒昧地在我称之为 tblTst 的表中添加了一个 id 列。这很方便选择一些特定的值(请参阅 (...) 子句中的 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

【讨论】:

  • 大家好,我试过你的 sql,效果很好。我需要一个 case 语句来比较差异,如下所示:- value1 > value2 --> +1 value1 -1 value1=value2 --> 0 然后我需要添加所有 +1,-1 (数字)... mjv,我没有尝试过你的,我正在考虑如何自动输入序列号。有什么想法吗?
  • @rayhan:如果表足够小——我认为是这样——你可以将它的所有行插入一个具有相同架构的新表中,再加上一个具有自动递增主键的额外列. Pax 和我的解决方案基本相同,除了 case 语句。如果将比较符号( 替换为 -1、0 和 +1,无论是作为数值还是作为字符串,你应该得到你需要的。你也可以将 CASE 语句复制到 Pax 的查询中。另一个技巧是使用 SIGN(ta.num -tb.num) 插入只是差异。
【解决方案3】:

为了我的理解,只是将@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 &lt 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)

【讨论】:

    猜你喜欢
    • 2018-06-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    相关资源
    最近更新 更多