仅显示MAX行

时间:2019-11-19 13:14:42

标签: sql oracle

我有一张表格,该表格向我显示了邮局的工作时间,问题是有时重复了一些:例如,我有星期六在同一时间从一个邮局显示两次。 解决方案是只显示1个星期六的MAX(ID),但我无法处理,因此认为我不必在select中显示id。 这是我的剧本

SELECT h.ID,
           h.POSTINDEX,
           H.LONGNAME_UA,
           h.SHORTNAME_UA,
           pt.LONGNAME_UA,
           h.parent_Id,
           WORKCOMMENT,
           INTERVALTYPE,
           TO_CHAR(TFROM, 'HH24:MI') AS TFROM,
           TO_CHAR(TTO, 'HH24:MI'),
           WD.NAME_UA,
           WD.NAME_EN,
           WD.NAME_RU,
           WD.SHORTNAME_UA,
           pt.isVPZ,
           lr.NAME_UA,
           lr.CODE
      FROM ADDR_PO_WORKSCHEDULE tt
        LEFT JOIN ADDR_POSTOFFICE h
          ON tt.POSTOFFICE_ID = h.ID
        INNER JOIN mdm_lockReason lr
          ON lr.id = H.LOCK_REASON
        INNER JOIN ADDR_POSTOFFICEtype pt
          ON pt.ID = H.POSTOFFICETYPE_ID
        INNER JOIN ADDR_PO_WORKDAYS wd
          ON wd.ID = tt.dayofweek
      where tt.datestop = TO_DATE('9999-12-31','YYYY-MM-DD') AND tt.postoffice_id = 8221
      HAVING MAX(tt.ID)
      ORDER BY h.postIndex,
               h.POSTOFFICETYPE_ID,
               dayofweek,
               intervaltype,
               tFrom,
               tto

如您所见,我已经添加了 HAVING MAX(tt.ID),但我知道这是错误的,并且不知道如何解决。请帮忙!

3 个答案:

答案 0 :(得分:0)

您可以使用row_number()

with t as (
      <your query here with no `having` and with tt.id as tt_id>
     )
select t.*
from (select t.*, row_number() over (order by tt_id desc) as seqnum
      from t
     ) t
where seqnum = 1;

答案 1 :(得分:0)

您可以按如下方式使用分析功能:

Select * from
(Select <your select column list>,
Row_number() over (partition by h.postindex, trunc(tfrom) order by tt.id desc nulls last) as rn
From <from clause>
Where <where clause>
)
Where rn = 1;

group by不需要。

答案 2 :(得分:0)

如果重复行的源来自ADDR_PO_WORKSCHEDULE表,则可以在将其用于其余查询之前将其重复数据删除:

SELECT 
  h.ID, h.POSTINDEX, h.LONGNAME_UA, h.SHORTNAME_UA, pt.LONGNAME_UA, h.parent_Id,
  WORKCOMMENT, INTERVALTYPE, TO_CHAR(TFROM, 'HH24:MI') AS TFROM, TO_CHAR(TTO, 'HH24:MI'),
  WD.NAME_UA, WD.NAME_EN, WD.NAME_RU, WD.SHORTNAME_UA, pt.isVPZ, lr.NAME_UA, lr.CODE
FROM (
  SELECT src.*
  FROM (
    SELECT t.*, 
      ROW_NUMBER() OVER(
        PARTITION BY tt.postoffice_id, tt.dayofweek -- Group by post office / day of week
        ORDER BY <order_columns> -- Rank rows within each group
      ) AS RowNum
    FROM ADDR_PO_WORKSCHEDULE t
  ) src
  WHERE RowNum = 1
) tt
LEFT JOIN ADDR_POSTOFFICE h ON tt.POSTOFFICE_ID = h.ID
INNER JOIN mdm_lockReason lr ON lr.id = H.LOCK_REASON
INNER JOIN ADDR_POSTOFFICEtype pt ON pt.ID = H.POSTOFFICETYPE_ID
INNER JOIN ADDR_PO_WORKDAYS wd ON wd.ID = tt.dayofweek
WHERE tt.datestop = TO_DATE('9999-12-31','YYYY-MM-DD') 
AND tt.postoffice_id = 8221
ORDER BY h.postIndex, h.POSTOFFICETYPE_ID, dayofweek, intervaltype, tFrom, tto

只需用要用于确定保留哪些“重复”行的列替换即可。如果顺序无关紧要,只需完全删除ORDER BY

此外,由于您要从多个表中进行选择,因此您可能想限定所有列引用。