我有一个销售数据集,看起来像这样
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中,我如何只获得一个产品销售的广告系列?也就是说,香蕉在campaign1或campaign2中出售,不算作出售两次。
销售额依赖于哪个广告系列并不重要。将有多行销售将重叠超过1个广告系列。
任何帮助都会很棒......
答案 0 :(得分: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
返回'banana'行,即使没有匹配的广告系列。在这种情况下,广告系列为NULL
。
使用ORDER BY
按照一些可用标准选择广告系列,而不只是获得符合条件的任意广告。
在 MS SQL 中,您将使用SELECT TOP n
在 Oracle WHERE rownum <= 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 。
在 MySQL 中不起作用,它既不支持CTE也不支持窗口函数。