Sql 使用group by基于层次逐个选择行
在上表中,有3行成员ID 222,具有活动、挂起和取消等多种状态。Sql 使用group by基于层次逐个选择行,sql,sql-server-2012,Sql,Sql Server 2012,在上表中,有3行成员ID 222,具有活动、挂起和取消等多种状态。 如果MemberId有多个状态,我需要先将它们设置为活动状态,然后设置为挂起状态,最后设置为取消状态。即使不是所有的状态值都存在,顺序也应该保持不变。我建议您使用一个子查询,对状态使用大小写,并将一个数字作为1附加到状态。主动,2。待决,3。取消,因为它们不是按字母顺序排列的,然后你可以对状态进行最大化,以获得你想要的 Lidia D.有一种解决方案,但可能是某种程度上的沉闷 如果您可以更新您的表,以便将状态和数字连接在一起,首
如果
MemberId
有多个状态,我需要先将它们设置为活动状态,然后设置为挂起状态,最后设置为取消状态。即使不是所有的状态值都存在,顺序也应该保持不变。我建议您使用一个子查询,对状态使用大小写,并将一个数字作为1附加到状态。主动,2。待决,3。取消,因为它们不是按字母顺序排列的,然后你可以对状态进行最大化,以获得你想要的
Lidia D.有一种解决方案,但可能是某种程度上的沉闷 如果您可以更新您的表,以便将状态和数字连接在一起,首先取决于它的优先级,如下所示
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
现在,您可以通过选择最大值(状态)进行分组
另外,您可以使用case语句来更新状态列,以便在开始时指定编号尝试按类顺序使用case for状态
:
select memberid, right(max(status),len(max(status))-1)
from yourtable
group by memberid
我没有得到任何错误,但我得到了MemberID 222的所有三行。但我希望先有活动行,如果成员只有挂起和取消状态,则挂起的行将首先被取消,否则将被取消
select memberid, right(max(status),len(max(status))-1)
from yourtable
group by memberid
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