我正在使用SQL Server2012。我遇到一种情况,我试图按客户的“最高”帐户状态汇总他们。因此,在“帐户”表上,我有customerkey,然后是每个帐户的状态。帐户状态可以打开,关闭或保留。客户可能有多个帐户,因此可以打开,关闭和保留他/她。在这种情况下,我们有一个层次结构:
因此,如果客户保留了任何帐户,则将保留他们。如果他们已开设任何帐户(但没有保留任何帐户),则会将其打开。如果它们已关闭(并且没有保留或打开),则它们将关闭。
例如
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
感谢任何指针!
答案 0 :(得分:5)
我们可以将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;
这里的基本思想是,将优先为保留的状态记录赋予第一个行号值,然后是关闭的记录,然后是打开的记录。
答案 1 :(得分:0)
您可以将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;