2

これは非常に単純な問題かもしれませんが、昨夜から頭が回らないようです。

私は3つのテーブルを持っています

VirtualLicense
VirtualLicenseId    ProductName
-----------------------------------
1           Transaction
2           Query
3           Transaction


Product
ProductId   Name
---------------------------
1           Transaction
2           Query


License
LicenseId   ExpiryDate  ProductId
-----------------------------------------
1           14/07/2013  1
2           13/07/2013  1
3           13/07/2013  2
4           14/07/2013  2

VirtualLicense と License は、Product テーブルを使用した ProductName と ProductId のマッピングを使用して結合されます。

基本的に VirtualLicenseId を LicenseId に割り当てることができる VirtualLicenseId と LicenseId の組み合わせを取得したいと考えています。ライセンス ID が VirtualLicenseId に割り当てられると、次の VirtualLicenseId では使用できなくなります。また、有効期限が近い(小さい)licenseidを先に割り当ててほしい。

したがって、サンプル データ セットの結果は次のようになります。

VirtualLicenseId    LicenseId
---------------------------------
1                   2
2                   3
3                   1

このためにテーブルをループしたくありません。私の説明とデータから私の問題が明確になることを願っています。

4

1 に答える 1

2

次のようなことができます。

  • 最初の CTE では、製品グループ内の VirtualLicenses のランキングを割り当てます。
  • 2 番目の CTE では、製品グループ内のライセンスのランキングを割り当てます (有効期限順)。
  • 最後に、productID とranking に関する 2 つのサブクエリを結合します。

WITH CTE_VL AS 
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY ProductId ORDER BY vl.VirtualLicenseId ASC) RN
    FROM dbo.VirtualLicense vl
    LEFT JOIN dbo.Product p ON vl.ProductName = p.Name
)
,CTE_License AS
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY ProductId ORDER BY ExpiryDate ASC) RN
    FROM dbo.License 
)
SELECT VirtualLicenseId, LicenseId 
FROM CTE_VL vl
LEFT JOIN CTE_License l ON vl.ProductId = l.ProductID AND vl.RN = l.RN

SQLFiddle デモ

于 2013-07-10T11:15:09.797 に答える