尝试连接 SQL 中的两个表时遇到问题
Trouble trying to join two tables in SQL
这是我第一次 post 在这个论坛上,如果我不清楚或我的问题格式不正确,请见谅。
我有以下 table, TABLE_MONTHS:
| Date | Year_Part | Month_part |
31-01-2016 2016 1
29-02-2016 2016 2
31-03-2016 2016 3
30-04-2016 2016 4
... ... ...
这个 table 简单地遍历了 2016 年全年,其中第一列是每个月的最后一天。
我还有一个table,TABLE_SAVINGS:
| Date | Year_Part | Month_part | Cumulative_Saved |
03-01-2016 2016 1 50
07-03-2016 2016 3 150
25-03-2016 2016 3 275
14-07-2016 2016 7 400
... ... ...
此 table 显示我将一些钱存入我的储蓄银行帐户的每个日期以及存入的金额。
我所追求的是加入这两个 table,这样得到的 table 看起来像这样:
| Date | Year_Part | Month_part | Cumulative_Saved |
31-01-2016 2016 1 50
29-02-2016 2016 2 50
31-03-2016 2016 3 275
30-04-2016 2016 4 275
31-05-2016 2016 5 275
30-06-2016 2016 6 275
31-07-2016 2016 7 400
... ... ...
本质上是一个 table,它不仅提供了我将钱存入我的储蓄账户的确切日期,还提供了我的储蓄账户中有多少钱的逐月记录。
我的问题是我正在努力找出连接这两个 table 的逻辑以获得我想要的结果。
经过多次尝试使它起作用后,'best' 我设法想出的是,
SELECT
A.*,
MAX(B.Cumulative_Saved) OVER
(PARTITION BY B.Month_part ORDER BY B.Month_part ASC)
FROM
TABLE_MONTHS A
LEFT JOIN
TABLE_SAVINGS B
ON A.[Date] <= B.[Date]
但这也会将 TABLE_MONTHS 的较早日期连接到 TABLE_SAVINGS 的较晚日期,因此我最终得到 TABLE_MONTHS 的每个日期的多个日期多行。
我还意识到,只有当 Cumulative_Saved 字段只增加(在我的数据中,它不会)时,这才会正常工作,否则我不一定会选择数据最接近的行从我的第一个 table.
到月底
我真的很难解决这些问题,希望得到答案,我真的看不出有什么方法可以让它发挥作用。
如果有任何不清楚的地方,请告诉我,我会尽力澄清我的意思。
我可以访问 Netezza 和 SSMS,所以最好回答其中一个问题。
提前感谢您的回答。
这在 SQL 服务器中更容易,使用横向连接:
select tm.*, ts.Cumulative_Saved
from table_months tm outer apply
(select top 1 tm
from table_saving ts
where ts.date <= tm.date
order by ds.date desc
) ts;
您可以在 Netezza 中使用 lag()
和 ignore nulls
:
select tm.*,
coalesce(ts.Cumulative_Saved,
lag(ts.Cumulative_Saved ignore nulls) over (order by tm.date)
) as Cumulative_Saved
from table_months tm left join
(select ts.*,
row_number() over (partition by date_trunc('month', ts.date) order by ts.date desc) as seqnum
from table_saving ts
) ts
on date_trunc('month', ts.date) = date_trunc('month', tm.date) and
seqnum = 1;
SQL 不是满足此类要求的最佳解决方案。在我看来,子选择(SELECT TOP 1 Cumulative_Saved WHERE...ORDER BY...)应该可以解决问题,并且比复杂的连接更具可读性。
这是我第一次 post 在这个论坛上,如果我不清楚或我的问题格式不正确,请见谅。
我有以下 table, TABLE_MONTHS:
| Date | Year_Part | Month_part |
31-01-2016 2016 1
29-02-2016 2016 2
31-03-2016 2016 3
30-04-2016 2016 4
... ... ...
这个 table 简单地遍历了 2016 年全年,其中第一列是每个月的最后一天。
我还有一个table,TABLE_SAVINGS:
| Date | Year_Part | Month_part | Cumulative_Saved |
03-01-2016 2016 1 50
07-03-2016 2016 3 150
25-03-2016 2016 3 275
14-07-2016 2016 7 400
... ... ...
此 table 显示我将一些钱存入我的储蓄银行帐户的每个日期以及存入的金额。
我所追求的是加入这两个 table,这样得到的 table 看起来像这样:
| Date | Year_Part | Month_part | Cumulative_Saved |
31-01-2016 2016 1 50
29-02-2016 2016 2 50
31-03-2016 2016 3 275
30-04-2016 2016 4 275
31-05-2016 2016 5 275
30-06-2016 2016 6 275
31-07-2016 2016 7 400
... ... ...
本质上是一个 table,它不仅提供了我将钱存入我的储蓄账户的确切日期,还提供了我的储蓄账户中有多少钱的逐月记录。
我的问题是我正在努力找出连接这两个 table 的逻辑以获得我想要的结果。
经过多次尝试使它起作用后,'best' 我设法想出的是,
SELECT
A.*,
MAX(B.Cumulative_Saved) OVER
(PARTITION BY B.Month_part ORDER BY B.Month_part ASC)
FROM
TABLE_MONTHS A
LEFT JOIN
TABLE_SAVINGS B
ON A.[Date] <= B.[Date]
但这也会将 TABLE_MONTHS 的较早日期连接到 TABLE_SAVINGS 的较晚日期,因此我最终得到 TABLE_MONTHS 的每个日期的多个日期多行。
我还意识到,只有当 Cumulative_Saved 字段只增加(在我的数据中,它不会)时,这才会正常工作,否则我不一定会选择数据最接近的行从我的第一个 table.
到月底我真的很难解决这些问题,希望得到答案,我真的看不出有什么方法可以让它发挥作用。
如果有任何不清楚的地方,请告诉我,我会尽力澄清我的意思。
我可以访问 Netezza 和 SSMS,所以最好回答其中一个问题。
提前感谢您的回答。
这在 SQL 服务器中更容易,使用横向连接:
select tm.*, ts.Cumulative_Saved
from table_months tm outer apply
(select top 1 tm
from table_saving ts
where ts.date <= tm.date
order by ds.date desc
) ts;
您可以在 Netezza 中使用 lag()
和 ignore nulls
:
select tm.*,
coalesce(ts.Cumulative_Saved,
lag(ts.Cumulative_Saved ignore nulls) over (order by tm.date)
) as Cumulative_Saved
from table_months tm left join
(select ts.*,
row_number() over (partition by date_trunc('month', ts.date) order by ts.date desc) as seqnum
from table_saving ts
) ts
on date_trunc('month', ts.date) = date_trunc('month', tm.date) and
seqnum = 1;
SQL 不是满足此类要求的最佳解决方案。在我看来,子选择(SELECT TOP 1 Cumulative_Saved WHERE...ORDER BY...)应该可以解决问题,并且比复杂的连接更具可读性。