【问题标题】:Trouble trying to join two tables in SQL尝试在 SQL 中连接两个表时遇到问题
【发布时间】:2017-08-31 15:25:36
【问题描述】:

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

我有下表,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,因此最好选择其中任何一个。

提前感谢您的任何回答。

【问题讨论】:

    标签: sql sql-server join netezza partition


    【解决方案1】:

    这在 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;
    

    您可以在 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;
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2019-07-14
        • 1970-01-01
        • 2020-01-31
        • 2013-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-09
        • 2011-07-13
        相关资源
        最近更新 更多