我有两个连接的表,父亲一个显示单位的名字,孩子显示记录温度,可以通过自动过程(自动)或用户插入。因此,对于给定的单位读取简单连接的记录看起来像
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
答案 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
只需使用不同的关键词看看这个例子! :)