2

私はSQLに比較的慣れていません。興味のある結果を得るには、Oracleクエリで複数のサブ選択が必要だと思いますが、クエリを正しく機能させることができませんでした。

「Customer」テーブルからベースデータをプルし、2番目のテーブル「Customer_Issue」から追加データをプルする必要があります。必要な他のフィールドを含む追加のテーブルがありますが、「顧客」テーブルへの結合を通じてそのデータを正常に結合/選択しました

「Customer_Issue」から必要なデータは、「Service」、「Service_Issue」、および「ServiceVersion」の各フィールドにあります。サービスごとに複数のサービスの問題があり、サービスの問題ごとに複数のサービスバージョンがあります。

サービスごとに、最大サービス問題のみを選択する必要があり、選択したサービス問題については、最大サービスバージョンのみを選択する必要があります。

副選択により、次のように最大サービスの問題を選択することができました。

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
4

2 に答える 2

1

最高の問題で最高のバージョンが必要だと思います。絶対にわかりませんが、それが私が質問を解釈している方法です。

もしそうなら、最良の解決策は使用すること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

order by顧客IDとサービスの組み合わせごとに、条項に基づいて問題を列挙します。最高の問題は、最高のservice_versionに対して「1」を取得します。私の推測では、これはあなたが望むものだと思います。

于 2013-02-26T15:27:37.223 に答える
0

私があなたの要件を理解しているなら、このような何かがあなたのサブクエリの問題を修正するために働くはずです:

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

ニーズに応じて、より簡単なアプローチがあるかもしれません。

于 2013-02-26T15:31:00.327 に答える