查询收集返回多个值的子查询的最大值
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()
,即使有并列。
我在 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
tableUTENTI
两次。 - 过滤条件可以放在
WHERE
子句中。 - 如果您只需要一行,请使用
ROW_NUMBER()
而不是RANK()
,即使有并列。