0

私は以下のようなテーブルを持っています

Account number |  Last Name  |   Status       |   date
111                doe           acknowledged   04-11-2013
111                doe           acknowledged   05-01-2013
111                doe           paid           05-10-2013
123                smith         acknowledged   05-15-2013
123                smith         acknowledged   05-22-2013
145                walter        paid           05-23-2013

同じ情報を保持しているが、ステータスと日付が異なるだけの名前と口座番号があります。

最新の日付を取得して現在の日付と比較しようとしています。今日はドウを 5-10 と、スミスを 5-22 と、ウォルターを 5-23 と比較します...

アカウントは複数回再確認できるようになり、支払いが完了すると再確認が停止されます。したがって、後日再検査を受けるのはスミスだけです。

承認済みのステータスを持つすべてのレコードを検索したいと考えています。私はこれらのどれにも支払われたくありません。

これまでのコードでは、レコードの最大日付を取得できましたが、両方が異なるため、確認済みレコードと有料レコードが返されます。支払われておらず、まだ承認されているレコードのみが必要です。

4

1 に答える 1

1

支払われていないアカウントの最新の承認済みステータスが必要なようです。そのためのクエリは次のとおりです。

select AccountNumber, Name,
       max(date)
from t
group by AccountNumber, Name
having sum(case when status = 'Paid' then 1 else 0 end) = 0

質問には2つの異なるステータスしかありません。それ以上のデータがあり、承認済みの最大日付だけが必要な場合は、次のようにします。

select AccountNumber, Name,
       max(case when status = 'Acknowledged' then date end)
from t
group by AccountNumber, Name
having sum(case when status = 'Paid' then 1 else 0 end) = 0

最新のステータスを取得するrow_number()には、行を列挙するために使用できます。

select AccountNumber, Name,
       max(case when status = 'Acknowledged' then date end),
       max(case when seqnum = 1 then status end) as MostRecentStatus
from (select t.*,
             row_number() over (partition by AccountNumber, Name order by date desc) as seqnum
      from t
     ) t
group by AccountNumber, Name
having sum(case when status = 'Paid' then 1 else 0 end) = 0
于 2013-06-18T23:10:46.783 に答える