[英]Are multiple subqueries needed to select max from 2 fields in the same table
我对SQL比较陌生。 我相信我需要在Oracle查询中进行多个子选择才能获得我感兴趣的结果,但是我一直无法使查询正常工作。
我需要从“客户”表中提取基本数据,并从第二个表“ Customer_Issue”中提取其他数据。 还有其他包含我需要的其他字段的表,但是我已经通过联接到“ Customer”表成功地联接/选择了该数据
我从“ Customer_Issue”中需要的数据在“服务”,“ Service_Issue”和“服务版本”字段中。 每个服务都有多个服务问题,每个服务都有多个服务版本。
对于每个服务,我只需要选择最大服务问题,对于该选定的服务问题,我只需要选择最大服务版本。
通过子选择,我能够选择最大服务问题,如下所示:
Select c.customer_id, ci.service, ci.service_issue
from customer c
left outer join CUSTOMER_issue ci on c.CUSTOMER_ID = ci.CUSTOMER_ID
join (select CUSTOMER_ID, service, max(service_ISSUE) as service_ISSUE
from CUSTOMER_issue
group by CUSTOMER_ID, service) ci1
on ci1.CUSTOMER_ID = ci.CUSTOMER_ID and ci1.service = ci.service
and ci1.service_issue = ci.service_issue
但是,我无法进行后续的子选择来获得最大服务版本。 这是我尝试过的(在查询中,它直接在上面的代码下面)
join (select CUSTOMER_ID, service, service_ISSUE, max (service_VERSION) as service_VERSION
from CUSTOMER_issue
group by CUSTOMER_ID, service, service_ISSUE) ci2
on ci1.CUSTOMER_ID = ci2.CUSTOMER_ID and ci1.service = ci2.service and
ci1.service_ISSUE = ci2.service_ISSUE and ci1.service_VERSION = ci2.service_VERSION
我怀疑您想要最高版本的最高版本。 我不确定,但这就是我解释这个问题的方式。
如果是这样,最好的解决方案是使用row_number()
:
select c.customer_id, ci.service, ci.service_issue
from customer c left outer join
(select ci.*,
ROW_NUMBER() over (partition by ci.customer_id, ci.service
order by service_issue desc, service_version desc
) as seqnum
from CUSTOMER_issue ci
) ci
on c.CUSTOMER_ID = ci.CUSTOMER_ID and
ci.seqnum = 1
对于每个客户ID /服务组合,它根据order by
子句枚举问题。 最高的问题将因其最高的service_version得到“ 1”。 我的猜测是,这就是您想要的。
如果我了解您的要求,类似这样的方法应该可以解决您的子查询问题:
SELECT
c.customer_id,
ci1.service,
ci1.service_name,
ci1.service_issue,
ci2.service_version
FROM customer c
JOIN (
SELECT CUSTOMER_ID, service, service_name, max(service_ISSUE) as service_ISSUE
FROM CUSTOMER_issue
GROUP BY CUSTOMER_ID, service, service_name
) ci1 ON c.CUSTOMER_ID = ci1.CUSTOMER_ID
JOIN (
SELECT CUSTOMER_ID, service, max(service_VERSION) as service_VERSION
FROM CUSTOMER_issue
GROUP BY CUSTOMER_ID, service
) ci2 ON c.CUSTOMER_ID = ci2.CUSTOMER_ID AND ci1.service = ci2.service
根据您的需求,可能会有更简单的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.