【问题标题】:SQL - Return unique rows based on 2 columns and a conditionSQL - 根据 2 列和一个条件返回唯一行
【发布时间】:2017-09-12 22:53:50
【问题描述】:

我在 HSQLDB 上有一个表,数据为

Id   Account    Opendate    Baldate      LastName ........ State
1    1234       040111      041217       Jackson           AZ 
2    1234       040111      051217       James             FL 
3    2345       050112      061213       Thomas            CA
4    2345       050112      061213       Kay               DE

我如何编写一个查询,让我的行在 Account 和 Opendate 列中具有不同的值,并具有最大 Baldate。如果 Baldate 也相同,则返回按 Id 排序的第一行。

所以结果集应该包含

Id   Account    Opendate    Baldate      LastName........State
2    1234       040111      051217       James           FL
3    2345       050112      061213       Thomas          CA

我已经走到这一步了。

select LastName,...,State, max(BalDate) from ACCOUNTS group by Account, Opendate 

但查询失败,因为我不能对不在分组依据(姓氏、状态等)的列使用聚合函数。我该如何解决这个问题?

【问题讨论】:

    标签: sql group-by distinct hsqldb


    【解决方案1】:

    HSQLDB 支持关联子查询,所以我认为这会起作用:

    select a.*
    from accounts a
    where a.id = (select a2.id
                  from accounts a2
                  where a2.account = a.account and a2.opendate = a.opendate
                  order by baldate desc, id asc
                  limit 1
                 );
    

    【讨论】:

    • 但这会返回所有行,不是吗?
    • @keanu。 . .不,它会返回一个错误。我添加了limit 1,这是我想要的逻辑所必需的。
    【解决方案2】:

    我不熟悉 hslqdb,所以这只是 ANSI。我看到它不支持分析功能,这会让生活更轻松。

    如果可行,另一个答案会干净得多。

    SELECT ACC_T1.Id,
           ACC_T1.Opendate,
           ACC_T1.Baldate
           ACC_T1.LastName,
           ...
           ACC_T1.State
      FROM Account_Table AS ACC_T1
     INNER
      JOIN (SELECT account,
                   OpenDate,
                   MAX(BalDate) AS m_BalDate
              FROM AccountTable
             GROUP
                BY account,
                   OpenDate
           ) AS SB1
        ON ACC_T1.Account = SB1.Account
       AND ACC_T1.OpenDate = SB1.OpenDate
       AND ACC_T1.BalDate = SB1.m_BalDate
     INNER
      JOIN (SELECT account,
                   OpenDate,
                   BalDate,
                   MIN(id) AS m_id
              FROM Account_Table
             GROUP
                BY account,
                   OpenDate,
                   BalDate
           ) AS SB2
        ON ACC_T1.Account = SB2.Account
       AND ACC_T1.OpenDate = SB2.OpenDate
       AND ACC_T1.BalDate = SB2.BalDate
       AND ACC_T1.id = SB2.m_id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-30
      • 1970-01-01
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多