代码之家  ›  专栏  ›  技术社区  ›  keanu

SQL-基于2列和一个条件返回唯一行

  •  0
  • keanu  · 技术社区  · 7 年前

    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 
    

    但查询失败,因为我无法对不在group by(姓氏、状态等)中的列使用聚合函数。我如何解决这个问题?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Gordon Linoff    7 年前

    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
                 );
    
        2
  •  0
  •   Error_2646    7 年前

    我不熟悉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