Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.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查询_Sql - Fatal编程技术网

交错两种不同状态的SQL查询

交错两种不同状态的SQL查询,sql,Sql,我有一个包含字段的表testtable Id Name Status 1 John active 2 adam active 3 cristy incative 4 benjamin inactive 5 mathew active 6 thomas inactive 7 james active 我想要一个查询,它应该像 Id Name Status

我有一个包含字段的表testtable

Id    Name       Status
1     John       active
2     adam       active
3     cristy    incative
4     benjamin  inactive
5     mathew    active
6     thomas    inactive
7     james     active
我想要一个查询,它应该像

Id    Name       Status

1     John       active
3     cristy    incative
2     adam       active
4     benjamin  inactive
5     mathew    active
6     thomas    inactive
7     james     active

我的问题是如何按照活动状态、非活动状态、活动状态、非活动状态等顺序记录。。就像这张表中的一样。

因为到目前为止您还没有发布任何您尝试过的示例,所以我将把我的回答也限制在一般方法上

一种方法是为活动行生成行号,为非活动行生成行号。从1开始为活动行编号,只使用奇数,这意味着每次将计数器增加2,并对非活动行使用2和偶数进行相同的操作。将这两个计数器放在同一列中

您将得到一个列,以便在ORDERBY子句中轻松排序

以下是一些可能对您有用的链接:


用这些试试看。如果你不能让它工作,那么告诉我们你迄今为止尝试了什么。在问题中发布一些示例代码,我们可能会为您提供指导

由于您尚未发布任何您尝试过的示例,因此我将把我的回答也限制在一般方法上

一种方法是为活动行生成行号,为非活动行生成行号。从1开始为活动行编号,只使用奇数,这意味着每次将计数器增加2,并对非活动行使用2和偶数进行相同的操作。将这两个计数器放在同一列中

您将得到一个列,以便在ORDERBY子句中轻松排序

以下是一些可能对您有用的链接:


用这些试试看。如果你不能让它工作,那么告诉我们你迄今为止尝试了什么。在问题中发布一些示例代码,我们可能会为您提供指导

此查询根据交错的活动/非活动状态进行排序:

SELECT [id], 
       [name], 
       [status] 
FROM   (
           (
             SELECT
                Row_number() OVER(ORDER BY id) AS RowNo, 
                0 AS sorter, 
                [id], 
                [name], 
                [status] 
             FROM   testtable 
             WHERE  [status] = 'active'
           ) 
           UNION ALL 
           (
             SELECT
                Row_number() OVER(ORDER BY id) AS RowNo, 
                1 AS sorter, 
                [id], 
                [name], 
                [status] 
             FROM   testtable 
             WHERE  [status] = 'inactive'
           )
       ) innerUnion 
ORDER  BY ( RowNo * 2 + sorter ) 
这种方法对两个SELECT语句使用内部联合,一个返回活动行,另一个返回非活动行。它们都生成了一个RowNumber,之后再乘以2以确保它始终是偶数。有一个sorter列,它只是一个位字段,并确保一个唯一的编号可用于排序:将其添加到RowNumber中会根据活动/非活动状态生成奇数或偶数,从而允许结果交错

SQL FIDLE链接位于此处,用于进行测试和操作:


在没有指定的数据库系统的情况下,我假设正在使用SQL Server 2008或更高版本。在其他DBMS上可能需要一个备用行编号系统。

此查询根据交错的活动/非活动状态进行排序:

SELECT [id], 
       [name], 
       [status] 
FROM   (
           (
             SELECT
                Row_number() OVER(ORDER BY id) AS RowNo, 
                0 AS sorter, 
                [id], 
                [name], 
                [status] 
             FROM   testtable 
             WHERE  [status] = 'active'
           ) 
           UNION ALL 
           (
             SELECT
                Row_number() OVER(ORDER BY id) AS RowNo, 
                1 AS sorter, 
                [id], 
                [name], 
                [status] 
             FROM   testtable 
             WHERE  [status] = 'inactive'
           )
       ) innerUnion 
ORDER  BY ( RowNo * 2 + sorter ) 
这种方法对两个SELECT语句使用内部联合,一个返回活动行,另一个返回非活动行。它们都生成了一个RowNumber,之后再乘以2以确保它始终是偶数。有一个sorter列,它只是一个位字段,并确保一个唯一的编号可用于排序:将其添加到RowNumber中会根据活动/非活动状态生成奇数或偶数,从而允许结果交错

SQL FIDLE链接位于此处,用于进行测试和操作:


在没有指定的数据库系统的情况下,我假设正在使用SQL Server 2008或更高版本。在其他数据库管理系统上需要一个备用的行编号系统。

最后我得到了答案

SET @rank=0;
SET @rank1=0;
SELECT @rank:=@rank+1 AS rank,id,name,status FROM `testtablejohn` where status='E'
UNION
SELECT @rank1:=@rank1+1 AS rank,id,name,status FROM `testtablejohn` where status='D'
order by rank

最后我得到了答案

SET @rank=0;
SET @rank1=0;
SELECT @rank:=@rank+1 AS rank,id,name,status FROM `testtablejohn` where status='E'
UNION
SELECT @rank1:=@rank1+1 AS rank,id,name,status FROM `testtablejohn` where status='D'
order by rank

您正在使用哪些RDBMS?请提供一个您尝试过的示例?为什么ID2是adam,突然变成cristy?如果有10个活动用户和2个非活动用户怎么办?@Elhana、@Renier、@Madhivanan我的问题是如何按活动状态、非活动状态、活动状态、非活动状态等顺序记录。。就像这个表中的一样。这看起来像是家庭作业问题,但有一个提示:2个查询操作rownum以返回偶数和奇数,然后按rownum使用select order将其包装,您使用的是哪种RDBMS?请提供一个您尝试的示例?为什么id 2是adam,突然变成cristy?如果有10个活动用户和2个非活动用户怎么办?@Elhana、@Renier、@Madhivanan我的问题是如何按活动状态、非活动状态、活动状态、非活动状态等顺序记录。。这看起来像是一个家庭作业问题,不过还是有一个提示:2个查询操作rownum以返回偶数和奇数的并集,然后用select order by rownum将其包装起来。现在,您只需要实现偶数/奇数的编号方案,就可以了。只需将@rank从-1开始,并将+2添加到每行的@rank和@rank1。现在您只需要实现偶数/奇数编号方案,就可以了。只需将@rank从-1开始,并将+2添加到每行的@rank和@rank1。