无法尝试在SQL

时间:2017-04-05 20:22:14

标签: sql sql-server join netezza partition

这是我在这个论坛上的第一篇文章,如果我不清楚或者我的问题格式不正确,请道歉。

我有下表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
    ...         ...           ...

此表仅适用于2016年的全年,其中第一列是每个月的最后一天。

我还有另一个表,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
    ...         ...           ...

此表显示我已将一些资金存入我的储蓄银行帐户并收取的金额。

我所追求的是这两个表的连接,这样得到的表如下所示:

|   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
    ...         ...           ...

基本上是一张表,而不仅仅是我将资金存入我的储蓄账户的确切日期,而是让我逐月记录我的储蓄账户中的金额。

我的问题是,我正在努力找出这两个表的连接逻辑以获得我想要的结果。

经过多次努力尝试让它发挥作用,我设法提出的“最好的”是,

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字段只增加(在我的数据中,它没有),这才能正常工作,否则我不一定会选择具有最接近月末日期的数据的行从我的第一张桌子开始。

我真的在努力解决这些问题,并希望得到答案,我真的看不出任何办法让它发挥作用。

如果有任何不清楚的地方,请告诉我,我会尽力澄清我的意思。

我可以访问Netezza和SSMS,所以答案最好。

提前感谢您的任何答案。

2 个答案:

答案 0 :(得分:0)

使用横向连接在SQL Server中更容易:

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;

您可以使用lag()ignore nulls

在Netezza中执行此操作
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;

答案 1 :(得分:0)

SQL不是满足此类要求的最佳解决方案。在我看来,一个子选择(SELECT TOP 1 Cumulative_Saved WHERE ... ORDER BY ...)可以做到这一点,并且比复杂的连接更具可读性。