如何使用 WITH 在 ROW_NUM 上进行 LEFT JOIN
How to LEFT JOIN on ROW_NUM using WITH
现在我正处于这个查询的测试阶段,所以我只在两个查询上测试它。我陷入了最后一部分,我想离开并加入所有内容(这必须扩展到 12 个单独的查询)。问题基本上正如标题所暗示的那样——我想使用 WITH() 语句在创建的 Row_Num 列上加入 12 个查询,而不是创建 12 个单独的 table 并将它们保存为 table 在数据库中。
WITH Jan_Table AS
(SELECT ROW_NUMBER() OVER (ORDER BY a.SALE_DATE) as Row_ID, a.SALE_DATE, sum(a.revenue) as Jan_Rev
FROM ba.SALE_TABLE a
WHERE a.SALE_DATE BETWEEN '2015-01-01' and '2015-01-31'
GROUP BY a.SALE_DATE)
SELECT ROW_NUMBER() OVER (ORDER BY a.SALE_DATE) as Row_ID, a.SALE_DATE, sum(a.revenue) as Jun_Rev, j.Jan_Rev
FROM ba.SALE_TABLE a
LEFT JOIN Jan_Table j
on "j.Row_ID" = a.Row_ID
WHERE a.SALE_DATE BETWEEN '2015-06-01' and '2015-06-30'
GROUP BY a.SALE_DATE
然后我收到此错误消息:
ERROR: column "j.Row_ID" does not exist
我输入了“j.Row_ID”,因为之前的消息是:
ERROR: column a.row_id does not exist Hint: Perhaps you meant to
reference the column "j.row_id".
每个查询在没有 JOIN 和 WITH 函数的情况下单独工作。我一年中的每个月都有一个,最终我想把其中的 12 个连在一起。
输出应该是包含 ROW_NUM 和 12 个月收入列的单列。每行应该是一个月中的一天。我知道不是每个月都有 31 天。因此,例如,二月只有 28 天,这意味着我希望第 29、30 和 31 天为 NULL。上面的查询仍然有日期——但在我可以让这两个查询加入后,我将删除“SALE_DATE”列。
我最初的想法只是创建 12 个 table,但我认为 space 的使用非常糟糕,如果我要扩展的话,这不是解决这个问题的最合乎逻辑的方法这个解决方案。
编辑
下面是上面两个 qaruies 的单独输出,第三个 table 是我想要做的。我不能给你原始数据。上面的所有内容都根据我正在使用的数据的实际列名和用途进行了更改。而且我不知道如何创建数据集——这在 SQL.
中太超出我的理解范围了
Jan_Table(前五行)
Row_Num Date Jan_Rev
1 2015-01-01 20
2 2015-01-02 20
3 2015-01-03 20
4 2015-01-04 20
5 2015-01-05 20
Jun_Table(前五行)
Row_Num Date Jun_Rev
1 2015-06-01 30
2 2015-06-02 30
3 2015-06-03 30
4 2015-06-04 30
5 2015-06-05 30
JOINED_TABLE(前五行)
Row_Num Date Jun_Rev Date Jan_Rev
1 2015-06-01 30 2015-01-01 20
2 2015-06-02 30 2015-01-02 20
3 2015-06-03 30 2015-01-03 20
4 2015-06-04 30 2015-01-04 20
5 2015-06-05 30 2015-01-05 20
您似乎可以对完整查询使用分组依据和条件聚合:
select day(sale_date),
max(case when month(sale_date) = 1 then sale_date end) as jan_date,
max(case when month(sale_date) = 1 then revenue end) as jan_revenue,
max(case when month(sale_date) = 2 then sale_date end) as feb_date,
max(case when month(sale_date) = 2 then revenue end) as feb_revenue,
. . .
from sale_table s
group by day(sale_date)
order by day(sale_date);
您还没有指定正在使用的数据库。 DAY()
是一个常用函数,用来获取月份中的第几天; MONTH()
是获取一年中月份的常用函数。但是,这些特定函数在您的数据库中可能有所不同。
现在我正处于这个查询的测试阶段,所以我只在两个查询上测试它。我陷入了最后一部分,我想离开并加入所有内容(这必须扩展到 12 个单独的查询)。问题基本上正如标题所暗示的那样——我想使用 WITH() 语句在创建的 Row_Num 列上加入 12 个查询,而不是创建 12 个单独的 table 并将它们保存为 table 在数据库中。
WITH Jan_Table AS
(SELECT ROW_NUMBER() OVER (ORDER BY a.SALE_DATE) as Row_ID, a.SALE_DATE, sum(a.revenue) as Jan_Rev
FROM ba.SALE_TABLE a
WHERE a.SALE_DATE BETWEEN '2015-01-01' and '2015-01-31'
GROUP BY a.SALE_DATE)
SELECT ROW_NUMBER() OVER (ORDER BY a.SALE_DATE) as Row_ID, a.SALE_DATE, sum(a.revenue) as Jun_Rev, j.Jan_Rev
FROM ba.SALE_TABLE a
LEFT JOIN Jan_Table j
on "j.Row_ID" = a.Row_ID
WHERE a.SALE_DATE BETWEEN '2015-06-01' and '2015-06-30'
GROUP BY a.SALE_DATE
然后我收到此错误消息:
ERROR: column "j.Row_ID" does not exist
我输入了“j.Row_ID”,因为之前的消息是:
ERROR: column a.row_id does not exist Hint: Perhaps you meant to reference the column "j.row_id".
每个查询在没有 JOIN 和 WITH 函数的情况下单独工作。我一年中的每个月都有一个,最终我想把其中的 12 个连在一起。
输出应该是包含 ROW_NUM 和 12 个月收入列的单列。每行应该是一个月中的一天。我知道不是每个月都有 31 天。因此,例如,二月只有 28 天,这意味着我希望第 29、30 和 31 天为 NULL。上面的查询仍然有日期——但在我可以让这两个查询加入后,我将删除“SALE_DATE”列。
我最初的想法只是创建 12 个 table,但我认为 space 的使用非常糟糕,如果我要扩展的话,这不是解决这个问题的最合乎逻辑的方法这个解决方案。
编辑
下面是上面两个 qaruies 的单独输出,第三个 table 是我想要做的。我不能给你原始数据。上面的所有内容都根据我正在使用的数据的实际列名和用途进行了更改。而且我不知道如何创建数据集——这在 SQL.
中太超出我的理解范围了Jan_Table(前五行)
Row_Num Date Jan_Rev
1 2015-01-01 20
2 2015-01-02 20
3 2015-01-03 20
4 2015-01-04 20
5 2015-01-05 20
Jun_Table(前五行)
Row_Num Date Jun_Rev
1 2015-06-01 30
2 2015-06-02 30
3 2015-06-03 30
4 2015-06-04 30
5 2015-06-05 30
JOINED_TABLE(前五行)
Row_Num Date Jun_Rev Date Jan_Rev
1 2015-06-01 30 2015-01-01 20
2 2015-06-02 30 2015-01-02 20
3 2015-06-03 30 2015-01-03 20
4 2015-06-04 30 2015-01-04 20
5 2015-06-05 30 2015-01-05 20
您似乎可以对完整查询使用分组依据和条件聚合:
select day(sale_date),
max(case when month(sale_date) = 1 then sale_date end) as jan_date,
max(case when month(sale_date) = 1 then revenue end) as jan_revenue,
max(case when month(sale_date) = 2 then sale_date end) as feb_date,
max(case when month(sale_date) = 2 then revenue end) as feb_revenue,
. . .
from sale_table s
group by day(sale_date)
order by day(sale_date);
您还没有指定正在使用的数据库。 DAY()
是一个常用函数,用来获取月份中的第几天; MONTH()
是获取一年中月份的常用函数。但是,这些特定函数在您的数据库中可能有所不同。