查询收集返回多个值的子查询的最大值

时间:2019-05-13 11:51:18

标签: sql oracle selection

我在Oracle数据库上遇到了SQL查询的另一个问题,我无法解决。我有3个表,其中两个表收集有关某些用户和结构的信息,另一个表收集结构的预订。通过查询,我应该能够显示在特定城市中某建筑物的最大预订量的用户名,在本例中为“ Torre annunziata”。

为了实现这一点,我创建了一个查询,其目的是显示一个表,该表为每个用户显示他为我先前提到的结构所做的预订量。

SELECT P.UTENTE, COUNT(Case when S.Citta = 'Torre Annunziata' then 1 else null end) as cnt
FROM PRENOTAZIONI P JOIN STRUTTURE S ON P.STRUTTURA = S.CODICE JOIN UTENTI ON P.UTENTE = UTENTI.CF
GROUP BY P.UTENTE;

这给出了预期的结果:table1

现在我尝试了以下方法:

SELECT UTENTI.NOME, UTENTI.COGNOME, MAX(cnt)
FROM UTENTI JOIN ( SELECT P.UTENTE, COUNT(Case when S.Citta = 'Torre Annunziata' then 1 else null end) as cnt
                    FROM PRENOTAZIONI P JOIN STRUTTURE S ON P.STRUTTURA = S.CODICE JOIN UTENTI ON P.UTENTE = UTENTI.CF
                    GROUP BY P.UTENTE) L ON UTENTI.CF = L.UTENTE
GROUP BY UTENTI.COGNOME, UTENTI.NOME;

但这将返回上一个查询的相同结果(带有每个人的姓名)。

根据我的请求,我期望的结果是用户0000000002的名称和姓氏,可能没有显示最大值。

我知道MAX函数会为每个用户返回值,因此我搜索了oracle的替代方法,但是我找不到可以应用于我的问题的解决方案。我希望有人能够帮助我。 在此先感谢您,我的英语不好。

1 个答案:

答案 0 :(得分:1)

您不希望聚合。请改用窗口函数。如果您想要联系:

SELECT u.*
FROM UTENTI u JOIN
     (SELECT P.UTENTE, u.NOME, u.COGNOME, COUNT(*) as cnt,
             RANK() OVER (ORDER BY COUNT(*) DESC) as seqnum
      FROM PRENOTAZIONI P JOIN
           STRUTTURE S
           ON P.STRUTTURA = S.CODICE JOIN
           UTENTI u
           ON P.UTENTE = u.CF
      WHERE S.Citta = 'Torre Annunziata'
      GROUP BY P.UTENTE, u.NOME, u.COGNOME
     ) u
WHERE seqnum = 1;

注意:

  • 您无需两次JOINUTENTI
  • 过滤条件可以放在WHERE子句中。
  • 即使在有关系的情况下也只需要一行,请使用ROW_NUMBER()代替RANK()