选择两个或更多结果的位置

时间:2017-10-26 12:36:10

标签: sql postgresql select

我有一张包含这些记录的表格:

id      viagem_id   erro    mensagem
9350    0000038037  false   Documento PAT 75928 foi gravado 2017-10-26 09:06:31
9349    0000038037  true    DOcumento SD 0000508183 item 000010 foi cancelado: Motivo RECUSA FINANCEIRA 2017-10-26 08:59:48

我希望结果记录表明旅行有一个或多个结果,但是计数不适用于postgres

select
    h.viagem_id,
    count(viagem_id),
    h.mensagem
from
    sap.hist_rec_viagem h 
where
    h.horario between '25/10/2017' and '27/10/2017'
group by
    h.viagem_id, mensagem
having
    count(viagem_id) > 1
order by
    viagem_id

3 个答案:

答案 0 :(得分:1)

如果您想要计算trips,请将mensagem从查询中删除:

select h.viagem_id, count(viagem_id)
from sap.hist_rec_viagem h 
where h.horario between '2017-10-25' and '2017-10-27'
group by h.viagem_id
having count(viagem_id) > 1
order by viagem_id;

如果您想要原始行中的所有细节,请使用窗口函数:

select h.*
from (select h.*, count(*) over (partition by viagem_id) as cnt
      from sap.hist_rec_viagem h 
      where h.horario between '2017-10-25' and '2017-10-27'
     ) h
where cnt > 1
order by viagem_id;

答案 1 :(得分:1)

如果您在同一viagem_id上搜索重复,请使用CTE表达式(类似于嵌套查询,但更优雅)来查找重复键,并在与原始表连接后选择详细信息:

with duplicate_viagem_id as
    select
        viagem_id,
        count(*) as nb
    from
        sap.hist_rec_viagem h 
    where
        h.horario between '25/10/2017' and '27/10/2017'
    group by
        h.viagem_id
    having
        count(*) > 1
),
select
     h.viagem_id,
     d.nb,
     h.mensagem
from
     sap.hist_rec_viagem h inner join duplicate_viagem_id d on 
        h.viagem_id=d.viagem_id

答案 2 :(得分:0)

正确的SQL:

select
    co.viagem_id,
    co.count,
    ca.mensagem
from
    (
        select
            h.viagem_id,
            count( viagem_id )
        from
            sap.hist_rec_viagem h
        where
            h.horario between '25/10/2017' and '27/10/2017'
        group by
            h.viagem_id
        having
            count( viagem_id )> 1
    ) co inner join(
        select
            viagem_id,
            mensagem
        from
            sap.hist_rec_viagem
    ) ca on
    (
        ca.viagem_id = co.viagem_id
    )
order by
    viagem_id