Join table with a view without having a column common - PostgreSQL

问题描述 投票:0回答:0

所以我有一个查询,它首先创建一个视图来查找最后一个星期一和 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 
sql postgresql join view
© www.soinside.com 2019 - 2024. All rights reserved.