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

Query gathering the max value of a subquery returning multiple values

我在 Oracle 数据库上遇到 SQL 查询的另一个问题,我无法解决。我有 3 个 table,其中两个收集有关某些用户和结构的信息,另一个收集结构的预订。多亏了一个查询,我应该能够显示在特定城市 中对结构进行 最大预订次数的用户的姓名,在本例中为 'Torre annunziata'。

为了实现这一点,我创建了一个查询,其 objective 用于显示一个 table,它显示每个用户对我之前的结构所做的预订量提到。

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;

但是这个return与之前查询的结果相同(每个人的名字)。

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

我知道 MAX 函数 return 每个用户的值,因此我搜索了 oracle 的替代方案,但我找不到可以应用于我的问题的解决方案。我希望有人能够帮助我。 提前致谢,抱歉我的英语不好。

您不需要聚合。请改用 window 函数。如果你想要领带:

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;

备注:

  • 您不需要 JOIN table UTENTI 两次。
  • 过滤条件可以放在WHERE子句中。
  • 如果您只需要一行,请使用 ROW_NUMBER() 而不是 RANK(),即使有并列。