Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用group by基于层次逐个选择行_Sql_Sql Server 2012 - Fatal编程技术网

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

Sql 使用group by基于层次逐个选择行,sql,sql-server-2012,Sql,Sql Server 2012,在上表中,有3行成员ID 222,具有活动、挂起和取消等多种状态。 如果MemberId有多个状态,我需要先将它们设置为活动状态,然后设置为挂起状态,最后设置为取消状态。即使不是所有的状态值都存在,顺序也应该保持不变。我建议您使用一个子查询,对状态使用大小写,并将一个数字作为1附加到状态。主动,2。待决,3。取消,因为它们不是按字母顺序排列的,然后你可以对状态进行最大化,以获得你想要的 Lidia D.有一种解决方案,但可能是某种程度上的沉闷 如果您可以更新您的表,以便将状态和数字连接在一起,首

在上表中,有3行成员ID 222,具有活动、挂起和取消等多种状态。

如果
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