1

次の表があります。

ここに画像の説明を入力

有効期限が切れた顧客のレコードを取得し、それに応じてテーブルを更新する方法を見つけようとしています (更新とは、関連する顧客の customer_id を持つエントリ 'SERVICE EXPIRED' を持つ新しいレコードを追加することを意味します)。

テーブルの一番下を見ると、既存の顧客 (customer_id 11 と 16) の「SERVICE EXPIRED」というエントリを持つ 2 つのレコードがあることがわかります。

次のような SQL クエリを探しています。

  1. customer_id によって個別のレコードの最後のセットを取得します
  2. 結果の結果セットから同じ customer_id のレコードを除外する

以下を使用する場合:

SELECT MAX(id) FROM mytable WHERE status_id != '2' AND expiry < '2012-12-26 19:00:00' GROUP BY customer_id

ID 1、11、13、および 16 が返されます。ただし、ID 11 と 16 は必要ありません。これは、有効期限のステータスが後で表に記載されているためです (表の最後の 2 つのレコードを参照)。 1 は更新されており、id 3 の有効期限が更新されていることがわかります。私が欲しいのは id 13 だけです。これは、テーブルの後半に表示される「SERVICE EXPIRED」エントリを持たない唯一の有効期限切れのレコードだからです。

この要件を満たすことができる SQL クエリを探しています。

前もって感謝します

4

3 に答える 3

0

効率的ではありませんが、これでうまくいくはずです。

SELECT MAX(id)
FROM mytable
WHERE status_id != '2'
    AND expiry < '2012-12-26 19:00:00'
    AND id NOT IN (SELECT id FROM mytable where status_id = 2)
GROUP BY customer_id

編集:サービス更新のケースを見逃しました。何か思いついたら更新します。

于 2012-12-26T19:12:48.310 に答える
0

あなたの要件は、レコードの最後の有効期限が切れた後に「n」個のレコードを見つけることと同じです。次のクエリは、特定の顧客の最後の有効期限以降のすべてのレコードを返します。

select t.*
from t join
     (select t.customer_id, MAX(id) as maxid
      from t
      where status_id = 2
     ) texp
     on t.customer_id = texp.customer_id and
        t.id > texp.maxid

変数を巧みに使用することで、これらを列挙して最後の "n" を取得できます。しかし、固定数は本当に必要ですか?なぜそれらすべてではないのですか?それらの1つだけではないのはなぜですか?

于 2012-12-26T19:13:22.010 に答える