2

テーブルには次のデータがあります (SQL Server 2008R2 を使用しています)。

顧客コード、デバイスの有効期限、デバイス名、ログ ID

S001, NULL, Dvc A, 1
S002, NULL, Dvc B, 2
S002, NULL, Dvc A, 3
S003, 2010-01-01, Dvc A, 4
S004, 2011-06-25, Dvc B, 5
S004, 2012-02-10, Dvc A, 5

ログ ID 列は実行番号に基づいています。

次の基準に基づいて、顧客コードごとに 1 つのレコードを選択したいと考えています。
- デバイス
の有効期限が null でない場合は、最新の日付のレコードを取得します。

したがって、選択されたレコードは次のようになります。

Customer Code, Device Expiry Date, Device Name, Log ID
S001, NULL, Dvc A, 1
S002, NULL, Dvc A, 3
S003, 2010-01-01, Dvc A, 4
S004, 2012-02-10, Dvc A, 5

クエリの出力は、マスター カスタマー コードとさらに結合されます。

Customer Code, Member Type
S001, Silver
S002, Gold
S003, Silver
S004, Silver
S005, Gold

結合すると、最終結果は次のようになります。

Customer Code, Member Type, Device Expiry Date, Device Code
S001, Silver, NULL, Dvc A
S002, Gold, NULL, Dvc A
S003, Silver, 2010-01-01, Dvc A
S004, Silver, 2012-02-10, Dvc A
S005, Gold, NULL, NULL

私が念頭に置いていたのは、Devices レコードを取得するためだけにいくつかのサブクエリを使用することです。上記の結果を得るためのアイデアを手伝ってください。前もって感謝します。

4

1 に答える 1

0

次のことを試すことができます(テストされていません)

;WITH q AS (
  SELECT  *, rn = ROW_NUMBER() OVER (PARTITION BY [Customer Code] ORDER BY [Log ID] DESC, CASE WHEN ISNULL([Device Expiry Date]) THEN 0 ELSE [Device Expiry Date]) END DESC)
  FROM    Devices
)
SELECT  *
FROM    q
WHERE   rn = 1

アイデアは、各行に行番号を追加することです。

  • お客様ごとにリセット
  • 最大のものから始まりますLog ID
  • 日付を持つレコードにはダミーの日付を使用しNULLます

ここで必要なのは、この行番号 = 1 の結果セットからすべてのレコードを選択することだけです。

于 2012-11-12T09:29:11.170 に答える