最新の日付で行を選択するSQL


106

次のクエリと結果を使用して、ChargeIdとChargeTypeが一意である最新のエントリを探しています。

select chargeId, chargeType, serviceMonth from invoice

    CHARGEID    CHARGETYPE  SERVICEMONTH
1   101     R       8/1/2008
2   161     N       2/1/2008
3   101     R       2/1/2008
4   101     R       3/1/2008
5   101     R       4/1/2008
6   101     R       5/1/2008
7   101     R       6/1/2008
8   101     R       7/1/2008

望ましい:

    CHARGEID    CHARGETYPE  SERVICEMONTH
1   101     R       8/1/2008
2   161     N       2/1/2008

回答:


147

GROUP BYを使用して、タイプとIDで項目をグループ化できます。次に、MAX()集約関数を使用して、最新のサービス月を取得できます。以下は、ChargeId、ChargeType、およびMostRecentServiceMonthを含む結果セットを返します

SELECT
  CHARGEID,
  CHARGETYPE,
  MAX(SERVICEMONTH) AS "MostRecentServiceMonth"
FROM INVOICE
GROUP BY CHARGEID, CHARGETYPE

1
ダウンストリームで必要になる場合に備えて、MAX(serviceMonth)フィールドにエイリアスを設定することを忘れないでください。
Ben Hoffstein 08年

2
それでは、表に行101 N 1/1/2008があるとどうなりますか?
tvanfosson 2008年

3
追加の行が返されます。これは、彼の要件に基づく望ましい結果です。
カールトンジェンケ2008年

1
投稿のクエリにエイリアスを追加しました。tvanfosson-これは、結果セットに追加された条件付きであり、正しいです。
ミッチェルセラーズ

1
それと一緒にレコードIDもプルしたい場合。どうすればいいですか?
Donny V.

58

したがって、これはリクエスタが求めていたものではありませんが、「最新の日付で行を選択するSQL」に対する答えです。

http://wiki.lessthandot.com/index.php/Returning_The_Maximum_Value_For_A_Rowから変更

SELECT t.chargeId, t.chargeType, t.serviceMonth FROM( 
    SELECT chargeId,MAX(serviceMonth) AS serviceMonth
    FROM invoice
    GROUP BY chargeId) x 
    JOIN invoice t ON x.chargeId =t.chargeId
    AND x.serviceMonth = t.serviceMonth

2
ありがとうございました!これは私が探していたものです!
ダイアナ

ビューと互換性がないようです。
nuzzolilo 2016


6

ほとんどの開発者は、大量のデータへの影響を調べずにインラインクエリを使用しています。

簡単に言えば、次の方法でこれを実現できます。

select a.chargeId, a.chargeType, a.serviceMonth 
from invoice a
left outer join invoice b
on a.chargeId=b.chargeId and a.serviceMonth <b.serviceMonth 
where b.chargeId is null
order by a.serviceMonth desc

1
select to.chargeid,t0.po,i.chargetype from invoice i
inner join
(select chargeid,max(servicemonth)po from invoice 
group by chargeid)t0
on i.chargeid=t0.chargeid

上記のクエリは、個別の請求IDに異なるChargetypeの組み合わせがある場合に機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.