使用group by基于层次结构逐个选择行

时间:2014-06-04 09:54:14

标签: sql sql-server-2012

SampleID | MemberId | MemberType | Status    | ExpDate
       1 |      222 | AA         | Active    | NULL
       2 |      222 | AA         | Pending   | NULL
       3 |      222 | AA         | Cancelled | 2014-06-04 13:35:04.267
       4 |      333 | AA         | Pending   | NULL
       5 |      333 | AA         | Cancelled | 2014-06-04 13:35:04.267
       6 |      444 | AA         | Cancelled | 2014-06-04 13:35:04.267

在上表中,会员ID 222有3行,有多个状态,如Active,Pending和Cancelled 如果MemberId有更多的那个状态我需要先订购Active,然后是Pending,并且最后取消。即使并非所有状态值都存在,订单也应该成立。

3 个答案:

答案 0 :(得分:0)

我建议您使用子状态使用案例作为状态,并将状态附加一个数字为1.活动,2。待定,3。取消,因为它们不是按字母顺序排列,然后您可以对状态执行最大操作得到你想要的东西。

Lidia D.

答案 1 :(得分:0)

有一个解决方案,但可能是某种程度上是沉闷的

如果你可以更新你的表,以便首先将状态与数字连接起来,这取决于它的优越性

SampleID MemberId MemberType Status ExpDate
1 222 AA 3Active NULL
2 222 AA 2Pending NULL
3 222 AA 1Cancelled 2014-06-04 13:35:04.267
4 333 AA 2Pending NULL
5 333 AA 1Cancelled 2014-06-04 13:35:04.267
6 444 AA 1Cancelled 2014-06-04 13:35:04.267 

现在您可以通过选择最大(状态)

进行分组
select memberid, right(max(status),len(max(status))-1)
from yourtable
group by memberid

P.S。您可以使用case语句来更新状态列,以便在开头

中汇总数字

答案 2 :(得分:0)

在ORDER BY类中尝试将ROW_NUMBER()与CASE一起用于Status

SELECT * FROM 
  (
   SELECT T.*,
       ROW_NUMBER() OVER (PARTITION BY MemberID
                          ORDER BY CASE Status 
                                    WHEN 'Active' THEN 1
                                    WHEN 'Pending' THEN 2
                                    WHEN 'Cancelled' THEN 3
                                   END ) as RN
    FROM T) as T1
WHERE RN=1

SQLFiddle demo