SQL Server-如何聚合和保留“最高”价值

时间:2018-11-06 13:24:34

标签: sql sql-server

我正在使用SQL Server2012。我遇到一种情况,我试图按客户的“最高”帐户状态汇总他们。因此,在“帐户”表上,我有customerkey,然后是每个帐户的状态。帐户状态可以打开,关闭或保留。客户可能有多个帐户,因此可以打开,关闭和保留他/她。在这种情况下,我们有一个层次结构:

  1. 保留
  2. 已打开
  3. 已关闭

因此,如果客户保留了任何帐户,则将保留他们。如果他们已开设任何帐户(但没有保留任何帐户),则会将其打开。如果它们已关闭(并且没有保留或打开),则它们将关闭。

例如

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

感谢任何指针!

2 个答案:

答案 0 :(得分:5)

我们可以将ROW_NUMBERCASE表达式一起使用:

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

这里的基本思想是,将优先为保留的状态记录赋予第一个行号值,然后是关闭的记录,然后是打开的记录。

答案 1 :(得分:0)

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