0

ここで見たものに基づいて、次の SELECT ステートメントを作成しました。SQL Select Max Date with Multiple records例を同じように設定しました。私はOracle 11gを使用しています。各 asset_tag に対して 1 つのレコードを返す代わりに、倍数を返します。ソース テーブルほど多くのレコードはありませんが、(私が思うに) 多いはずです。内部の SELECT ステートメントを実行すると、正しいレコード セット (asset_tag ごとに 1 つ) も返されますが、これには本当に困惑しました。

SELECT 
outside.asset_tag,
outside.description, 
outside.asset_type, 
outside.asset_group, 
outside.status_code, 
outside.license_no, 
outside.rentable_yn, 
outside.manufacture_code, 
outside.model, 
outside.manufacture_vin, 
outside.vehicle_yr, 
outside.meter_id, 
outside.mtr_uom, 
outside.mtr_reading, 
outside.last_read_date
FROM mp_vehicle_asset_profile outside
RIGHT OUTER JOIN
  (
  SELECT asset_tag, max(last_read_date) as last_read_date
  FROM mp_vehicle_asset_profile
  group by asset_tag
  ) inside
ON outside.last_read_date=inside.last_read_date

助言がありますか?

4

2 に答える 2

0

分析関数を試してください:

SELECT  outside.asset_tag,
        outside.description, 
        outside.asset_type, 
        outside.asset_group, 
        outside.status_code, 
        outside.license_no, 
        outside.rentable_yn, 
        outside.manufacture_code, 
        outside.model, 
        outside.manufacture_vin, 
        outside.vehicle_yr, 
        outside.meter_id, 
        outside.mtr_uom, 
        outside.mtr_reading, 
        outside.last_read_date
FROM (  SELECT *, ROW_NUMBER() OVER(PARTITION BY asset_tag ORDER BY last_read_date DESC) Corr
        FROM mp_vehicle_asset_profile) outside
WHERE Corr = 1
于 2012-05-25T21:41:03.853 に答える
0

追加する必要があると思います...

AND outside.asset_tag=inside.asset_tag

ON...あなたのリストの基準に。

また、 aRIGHT OUTER JOINは必要ありません。に存在しないとの組み合わせはサブクエリに存在しないためINNER JOIN、 は同じ結果を返します (より効率的である可能性があります) 。asset_taglast_read_datemp_vehicle_asset_profile

それでも、「同点」、つまり同じlast_read_date. 対照的に、@Lamak の分析ベースの回答は、この状況で正確に 1 つの行を任意に選択します。

あなたのコメントはmtr_readinglast_read_date.

句の を次のように変更することで、@Lamak の分析ベースの回答を変更してこれを行うことができますORDER BYOVER

ORDER BY last_read_date DESC, mtr_reading DESC

asset_tagそれでも同順位 (つまり、同じ、last_read_date、およびを持つ複数の行mtr_reading) がある場合、クエリは再び、厳密に 1 つの行を選択します。

mtr_reading次のように、最高値を使用して同点を解消するために、集計ベースの回答を変更できます。

SELECT  
    outside.asset_tag, 
    outside.description,
    outside.asset_type,
    outside.asset_group,
    outside.status_code,
    outside.license_no,
    outside.rentable_yn,
    outside.manufacture_code,
    outside.model,
    outside.manufacture_vin,
    outside.vehicle_yr,
    outside.meter_id,
    outside.mtr_uom,
    outside.mtr_reading,
    outside.last_read_date 
FROM 
    mp_vehicle_asset_profile outside 
    INNER JOIN 
    ( 
        SELECT
            asset_tag, 
            MAX(last_read_date) AS last_read_date,
            MAX(mtr_reading) KEEP (DENSE_RANK FIRST ORDER BY last_read_date DESC) AS mtr_reading
        FROM
            mp_vehicle_asset_profile 
        GROUP BY
            asset_tag 
    ) inside 
    ON 
        outside.asset_tag = inside.asset_tag
        AND
        outside.last_read_date = inside.last_read_date
        AND
        outside.mtr_reading = inside.mtr_reading

それでも同順位 (つまり、同じasset_taglast_read_date、およびを持つ複数の行mtr_reading) がある場合、クエリは再び複数の行を返す可能性があります。

分析ベースの回答と集計ベースの回答が異なるもう 1 つの点は、NULL の扱いです。asset_taglast_read_date、またはのいずれかmtr_readingが null の場合、分析ベースの回答は関連する行を返しますが、集計ベースの回答はそうではありません ( TRUEnull が含まれる場合、結合の等価条件が評価されないためです。

于 2012-05-26T12:46:57.313 に答える