交错两种不同状态的SQL查询
我有一个包含字段的表testtable交错两种不同状态的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
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。