0

私はこのような売上のデータセットを持っています

Product  sold.date
apple    01/jan/2012
banana   01/feb/2012
orange   01/mar/2012

同じ期間にキャンペーンがあります。

Campaign name      start           end
campaign1        01/jan/2012     15/feb/2012
campaign2        01/feb/2012     01/mar/2012

SQLで、製品が販売されたキャンペーンを1つだけ取得するにはどうすればよいですか?つまり、バナナはキャンペーン1またはキャンペーン2で販売され、2回の販売としてカウントされません。

売上がどのキャンペーンに期待されているかは関係ありません。1つ以上のキャンペーンと重複する複数の販売行があります。

どんな助けでも素晴らしいでしょう...

4

1 に答える 1

1

1 つの商品で 1 つのキャンペーンを取得

RDBMS に名前を付けていません。PostgreSQLまたはMySQLでは、LIMIT 1.

SELECT p.Product, c.Camgaign
FROM   p
LEFT   JOIN c ON p.sold_date BETWEEN c.start AND c.end
WHERE  p.Product = 'banana'
-- ORDER BY <something>
LIMIT  1;

LEFT [OUTER] JOIN一致するキャンペーンがない場合でも、「バナナ」行を返すために使用します。その場合はキャンペーンになりますNULL

資格のある任意のキャンペーンを取得するのではなく、いくつかの利用可能な基準によってキャンペーンORDER BY選択するために使用します。

MS SQL では、を使用しますSELECT TOP nオラクル
で; WHERE rownum <= 1


すべての製品で 1 つのキャンペーンを取得

WITH x AS (
    SELECT p.Product, c.Camgaign
          ,row_number() OVER (PARTITION BY p.Product) AS rn
    FROM   p
    LEFT   JOIN c ON p.sold_date BETWEEN c.start AND c.end
    WHERE  p.Product = 'banana'
    )
SELECT Product, Camgaign
FROM   x
WHERE  rn = 1
   OR  rn IS NULL;  -- to include prod. without campaign

PostgreSQLでテスト済み、MS SQL ServerまたはOracleで動作します。CTE もウィンドウ関数もサポートしていないMySQL
では機能しません。

于 2012-05-26T16:19:06.007 に答える