如何比较同一个表上最后插入的两个指定行的列值?

时间:2017-10-30 13:28:40

标签: sql sql-server database automated-tests

我有一个数据集正在由客户在每个操作maden上更新。 例如,我通过

获得客户的最后两个操作
select id, 
       referance 
from (select id, 
             referance, 
             row_number() 
             over (order by time desc) as seqnum 
      from mytable where id=':id') 
al where seqnum <= 2

其中id来自功能文件。但现在我需要比较这两个操作的参考值。

mytable的:

id  | name  | referance  |   time   |
-------------------------------------
11  |  abc  |   4589     |   09:05  |
11  |  abc  |   1234     |   09:04  |
10  |  xyz  |   0185     |   09:02  |
15  |  qpr  |   9564     |   08:54  | 

等......

同样,我可以得到id = 11的最后两行;并且,就所有列都不是(null)而言,它返回“true”,这就是我想要的字面意思。 但我还想比较他们的反抗是否相同;并且,当我调用查询时,它必须返回“true”或“false”。

提前致谢

P.S。我实际上只需要一个有用的功能或想法。我已经尝试使用内连接但无法管理它:

select table1.id, 
       table1.referance, 
       table2.id, 
       table2.referance 
from (select id, 
             referance, 
             row_number() 
             over (order by time desc) as seqnum 
      from mytable where id=':id') table1 
      inner join (select id, 
                         referance, 
                         row_number() 
                         over (order by time desc) as seqnum 
                  from mytable where id=':id') table2 
      on table1.referance != table2.referance 
al where seqnum <= 2 order by seqnum

2 个答案:

答案 0 :(得分:1)

id上汇总当前查询,并检查两个参考值是否相同。

select
    id,
    case when count(distinct reference) = 1
         then 'true' else 'false' end as result
from
(
    select id, reference,
        row_number() over (order by time desc) as seqnum
    from table
    where id=':id'
) al
where seqnum <= 2
group by id;

如果两个记录的reference的非重复计数为1,则表示它们具有相同的值。否则,我们可以假设值不同。

答案 1 :(得分:1)

您为什么使用row_nubmer()?您可以将最后两行显示为:

select top 2 id, referance 
from mytable
where id=':id'
order by time desc;

然后,您可以使用聚合确定这些是否相同:

select (case when min(reference) <> max(reference) then 'false'
             else 'true'
        end) as is_same
from (select top 2 id, referance 
      from mytable
      where id=':id'
      order by time desc
     ) t;

注意:这不会将NULL的{​​{1}}值考虑在内,但这很容易纳入逻辑中。