从联合表中选择最新的,不包括重复项

时间:2014-11-06 01:51:23

标签: sql sql-server-2008-r2

我有两个连接的表,父亲一个显示单位的名字,孩子显示记录温度,可以通过自动过程(自动)或用户插入。因此,对于给定的单位读取简单连接的记录看起来像

UNIT      TEMP       TIMESTAMP      DATA_SOURCE
ABC       -20        10:26          AUTO
ABC       -19        11:27          USER
ABC       -19        11:27          AUTO

目标是选择最新的临时读数。我可以使用子查询来执行此操作:

   SELECT A.UNIT, B.TEMP, B.TIMESTAMP,B.DATA_SOURCE
   FROM units_table A left outer join readings_table B on A.Gkey=B.unit_gkey
   WHERE B.TIMESTAMP= 
           (SELECT MAX(TIMESTAMP) FROM readings_table B1 
            WHERE A.Gkey=B1.unit_gkey)    

这很简单,但在上面的例子中有两个确切的时间戳,所以我会得到两个读数。在这种情况下,我想忽略AUTO源。有一种优雅的方式吗?

编辑:要清楚我只想要一个结果:   ABC -19 11:27 USER

2 个答案:

答案 0 :(得分:2)

您可以使用row_number()代替:

SELECT ut.UNIT, rt.TEMP, rt.TIMESTAMP, rt.DATA_SOURCE
FROM units_table ut left outer join
     (SELECT rt.*,
             row_number() over (partition by rt.unit_Gkey
                                order by timestamp desc,
                                         (case when rt.data_source = 'AUTO' then 1 else 0 end)
                               ) as seqnm
      FROM readings_table rt
     ) rt
     on rt.unit_Gkey = ut.gkey
WHERE rt.seqnum = 1;

注意:如果您需要重复项,则可以使用rank()dense_rank()代替row_number()(并删除order by中的第二个子句)。

答案 1 :(得分:0)

http://www.w3schools.com/sql/sql_distinct.asp

只需使用不同的关键词看看这个例子! :)