sql - 分组依据比选择的字段少
问题描述
我有两个 Oracle 表:
USER(ID*,NAME,SURNAME)
MATCH(ID*,START_DATE,END_DATE,MATCH_CODE,ID_USER**)
我需要一个查询来为每个 USER 获取 END_DATE 和 START_DATE 之间的最大差异(以秒为单位)以及 NAME 和 MATCH_CODE 字段的匹配。
我的查询:
SELECT A.ID,A.NAME,MAX(extract(second from (END_DATE-START_DATE))
+ extract(minute from (END_DATE-START_DATE)*60
+ extract(hour from (END_DATE-START_DATE)*60*60
+ extract(day from (END_DATE-START_DATE)*60*60*24) max_differance
FROM USER A JOIN MATCH B
ON A.ID = B.ID_USER
GROUP BY A.ID;
我正在考虑这个查询,但显然它给出了一个错误,因为在 GROUP BY 中选择的所有字段。我还需要 MATCH_CODE 字段,我该怎么做?
解决方案
聚合name
列并用于MAX ... KEEP
获取match_code
:
SELECT u.id,
MAX(u.name) AS name,
MAX(end_date - start_date)*24*60*60 AS max_difference,
MAX(match_code) KEEP (
DENSE_RANK LAST
ORDER BY end_date - start_date NULLS FIRST
) As match_code
FROM "USER" u
INNER JOIN match m
ON (u.id = m.id_user)
GROUP BY u.id
或者,使用分析函数:
SELECT id,
name,
max_difference,
match_code
FROM (
SELECT u.id,
u.name,
(end_date - start_date)*24*60*60 AS max_difference,
match_code,
ROW_NUMBER() OVER (PARTITION BY u.id ORDER BY end_date - start_date DESC)
AS rn
FROM "USER" u
INNER JOIN match m
ON (u.id = m.id_user)
)
WHERE rn = 1;
推荐阅读
- amazon-s3 - Airflow/minio:如何使用 minio 作为本地 S3 代理来处理从 Airflow 发送的数据?
- python - 如何在graphene-python DjangoObjectType中获取模型的当前实例
- java - 使用 Selenium 在 Chrome 上处理“您与此站点的连接不是私有的”弹出窗口
- javascript - 如何解决“不变违规:此导航器缺少导航道具”?
- google-cloud-messaging - 是否必须从 GCM 迁移到 FCM 以获取 chrome/浏览器通知
- python - 如何将列表中的每个项目连接到特定的 URL?
- mysql - 使用紧凑的 laravel 显示数据
- java - 如何修复 Netbeans 中的“未找到 Log4j 2 配置文件”?
- python - 如何在烧瓶应用程序的索引页面中访问另一个网页?
- sql - 连接两个有时缺少连接值的表