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 中销售,不计为销售两次。

销售依赖于哪个广告系列并不重要。会有多行销售重叠超过 1 个广告系列。

任何帮助都会很棒...

4

1 回答 1

1

为 1 个产品获得 1 个广告系列

您没有命名您的 RDBMS。在PostgreSQLMySQL中,您可以使用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 ServerOracle中工作。
不适用于既不支持 CTE 也不支持窗口函数的MySQL 。

于 2012-05-26T16:19:06.007 回答