代码之家  ›  专栏  ›  技术社区  ›  Scott Davies

SQL Server-如何聚合和保留“top”值

  •  1
  • Scott Davies  · 技术社区  · 6 年前

    我正在使用SQL Server 2012。我有一种情况,我试图通过他们的“顶级”帐户状态来聚集客户。所以在Accounts表中,我有customerkey,然后每个帐户的状态。账户状态可以是开户、销户、留存。一个客户可能有多个帐户,因此可以打开、关闭和保留他/她。在这种情况下,我们有一个层次结构:

    1. 保留
    2. 关闭

    CustomerKey Account Number  Status
    A11         1234    Retained
    A11         1235    Closed
    A21         1236    Closed
    A34         1223    Retained
    A34         1566    Opened
    A54         1677    Opened
    

    期望输出为

    CustomerKey   Status
    A11           Retained
    A21           Closed
    A34           Retained
    A54           Opened
    

    谢谢你的指点!

    3 回复  |  直到 6 年前
        1
  •  5
  •   Tim Biegeleisen    6 年前

    我们可以利用 ROW_NUMBER 用一个 CASE 表达式:

    SELECT CustomerKey, Status
    FROM
    (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY CustomerKey
            ORDER BY CASE WHEN Status = 'Retained' THEN 0
                          WHEN Status = 'Closed' THEN 1
                          WHEN Status = 'Opened' THEN 2 END) rn
        FROM yourTable
    ) t
    WHERE rn = 1;
    

    enter image description here

    Demo

        2
  •  0
  •   download dowload    6 年前

    你可以用 ROW_NUMBER ORDER BY [Account Number] :

     SELECT CustomerKey, Status
        FROM
          (
               SELECT *, ROW_NUMBER() OVER (PARTITION BY CustomerKey
               ORDER BY [Account Number] ASC) rn
               FROM Table
          ) t
       WHERE rn = 1;