所以我有一个查询,它首先创建一个视图来查找最后一个星期一和 4 周前的日期以便稍后使用它,然后我在我的查询中使用它。但是我想知道我是否可以连接表来简化查询。
-- Find the dates
CREATE VIEW dates AS(
SELECT last_monday,
last_monday - 28 AS four_weeks_ago
FROM(
SELECT (current_date - ((6 + CAST(extract(dow FROM current_date) AS int)) % 7)) AS last_monday
) A
);
-- Find products that sold > 100 in the weeks
CREATE TEMPORARY VIEW Products_100 AS
SELECT product.ID,
CASE
WHEN sales_date BETWEEN (SELECT four_weeks_ago FROM Dates) AND (SELECT four_weeks_ago + 7 FROM Dates) THEN 'Week 1'
WHEN sales_date BETWEEN (SELECT four_weeks_ago + 7 FROM Dates) AND (SELECT four_weeks_ago + 14 FROM Dates) THEN 'Week 2'
WHEN sales_date BETWEEN (SELECT four_weeks_ago + 14 FROM Dates) AND (SELECT four_weeks_ago + 21 FROM Dates) THEN 'Week 3'
ELSE 'Week 4'
END AS Weeks_Product
FROM Sales
WHERE sales_date BETWEEN (SELECT four_weeks_ago FROM Dates) AND (SELECT last_monday FROM Dates)
GROUP BY product.ID, Weeks_Product
HAVING SUM (total_sales) > 100
**Instead of repeating the info a lot, could I use a join like this?**
-- Find the dates
CREATE VIEW dates AS(
SELECT last_monday,
last_monday - 28 AS four_weeks_ago
FROM(
SELECT (current_date - ((6 + CAST(extract(dow FROM current_date) AS int)) % 7)) AS last_monday
) A
);
-- Find products that sold > 100 in the weeks
CREATE TEMPORARY VIEW Products_100 AS
SELECT product.ID,
CASE
WHEN sales_date BETWEEN four_weeks_ago AND (four_weeks_ago + 7) THEN 'Week 1'
WHEN sales_date BETWEEN (four_weeks_ago + 7) AND (four_weeks_ago + 14) THEN 'Week 2'
WHEN sales_date BETWEEN (four_weeks_ago + 14) AND (four_weeks_ago + 21) THEN 'Week 3'
ELSE 'Week 4'
END AS Weeks_Product
FROM Sales
JOIN Dates ON sales_date BETWEEN four_weeks_ago AND last_monday
WHERE sales_date BETWEEN (SELECT four_weeks_ago FROM Dates) AND (SELECT last_monday FROM Dates)
GROUP BY product.ID, Weeks_Product
HAVING SUM (total_sales) > 100