2015-12-08 89 views
1

我被困在一个查询中,为每一个实体获得24行的查询中的最后一个条目。我已经阅读了this thred中的sollution相当类似的问题,但我无法将其纳入到我现有的查询中。在每天的多个条目中只获取最后一行

我现有的查询:

SELECT distinct b.Udc_id as EAN, sax.attrib_01, c.channel_no, a.local_read_time, a.read, a.Status 
from register_reads a, lookup_mv_channels1 c, lookup_mv_sdps b 
LEFT outer JOIN [email protected] sa 
ON sa.x_udc_asset_id = b.Udc_id 
LEFT outer JOIN [email protected] sax 
ON sax.par_row_id = sa.row_id 
WHERE c.Channel_id = a.channel_id 
AND b.meter_id = c.meter_id 
AND sax.attrib_02 = 'Y' 
AND a.local_read_time >= (SYSDATE) - 1 
order by b.Udc_id, a.local_read_time 

从这个意愿,例如结果是:

||EAN | ATTRIB_01 | channel_no | LOCAL_READ_TIME | READ | STATUS|| 
||1234| ready  |  1  |09/11/2015 01:00:01|  0| val || 
||1234| ready  |  1  |09/11/2015 02:00:01| 10| val || 
||1234| ready  |  1  |  ...  | ...| val || 
||1234| ready  |  1  |09/11/2015 23:59:01| 60| val || 
||3456| ready  |  1  |09/11/2015 01:00:01| 204| val || 
||3456| ready  |  1  |  ...  | ...| val || 
||3456| ready  |  1  |09/11/2015 23:58:01| 400| val || 

我想达到的结果是:反馈后

||EAN | ATTRIB_01 | channel_no | LOCAL_READ_TIME | READ | STATUS|| 
||1234| ready  |  1  |09/11/2015 23:59:01| 60| val || 
||3456| ready  |  1  |09/11/2015 23:58:01| 400| val || 

变化从@levelonehuman:

SELECT b.Udc_id as EAN, 
     c.physical_channel_no, 
     a.local_read_time, 
     a.cum_read, 
     a.validation_Status 
FROM register_reads a, lookup_mv_channels1 c, lookup_mv_sdps b 
    INNER JOIN (SELECT b.Udc_id, 
         MAX(a.LOCAL_READ_TIME) AS LOCAL_READ_TIME 
       FROM register_reads, lookup_mv_sdps b 
       GROUP BY b.Udc_id) AS t2 
    ON b.Udc_id = t2.Udc_id AND b.LOCAL_READ_TIME = t2.LOCAL_READ_TIME 
; 
+0

基于链接你使用SQL服务器? – Betlista

+0

查询看起来不太好。您不应该将20世纪80年代使用的逗号分隔连接语法与最新的显式连接混合在一起,但只能使用后者。由于where子句中的条件使得它们仅仅是内连接,所以你有两个外连接不起作用。为什么你需要独特?对于register_read,可以找到同样的sax.attrib_01多重折叠,你必须消除这样的重复? –

+0

请标记您的DBMS。 –

回答

1

注:这是MSSQL

您需要添加额外的连接S表示无论其他表,但可以使用MAX(LOCAL_READ_TIME)GROUP BY EAN让你的最后一行:

SELECT EAN, 
     ATTRIB_01, 
     channel_no, 
     LOCAL_READ_TIME, 
     READ, 
     STATUS 
FROM TableName t1 
    INNER JOIN ( SELECT EAN, 
          MAX(LOCAL_READ_TIME) AS LOCAL_READ_TIME 
        FROM TableName 
        GROUP BY EAN 
    ) AS t2 ON t1.EAN = t2.EAN AND t1.LOCAL_READ_TIME = t2.LOCAL_READ_TIME 

INNER JOIN部分将选择在TableName行是有EANMAX(LOCAL_READ_TIME) - 那么,你会回来参加到TableName(同一张表),根据JOIN标准选择其余数据。

实际上,这会过滤掉不符合EAN + MAX(LOCAL_READ_TIME)条件的行。

+0

如果两个记录具有相同的LOCAL_READ_TIME,该怎么办? (它看起来像数据有1分钟的分辨率) – ebyrob

+0

@ebyrob外部'SELECT'语句将返回符合'INNER JOIN'标准的所有行,因此在这种情况下,您会看到两行。如果该表具有“身份”列,则该点是没有意义的。否则,数据需要按其他因素进行分组/过滤。很难说这里给出的是什么。 – levelonehuman

+0

坦克为您的答案Thorsten。我会尝试以更好的方式写入连接。正如所指出的那样,由于sax.attrib_01的原因,我需要使用“Distinct”来避免多行数据行。 – JanBergan

相关问题