SQL 服务器查询按序列排序
SQL Server query order by sequence serie
我正在编写一个查询,我希望它按系列进行排序。前七条记录应按 1、2、3、4、5、6 和 7 排序。然后它应该重新开始。
我试过分区,last_value但我想不通。
这是 SQL 代码:
set language swedish;
select
tblridgruppevent.id,
datepart(dw,date) as daynumber,
tblRidgrupper.name
from
tblRidgruppEvent
join
tblRidgrupper on tblRidgrupper.id = tblRidgruppEvent.ridgruppid
where
ridgruppid in (select id from tblRidgrupper
where corporationID = 309 and Removeddate is null)
and tblridgruppevent.terminID = (select id from tblTermin
where corporationID = 309 and removedDate is null and isActive = 1)
and tblridgrupper.removeddate is null
order by
datepart(dw, date)
这是一个结果示例:
5887 1 J2
5916 1 J5
6555 2 Junior nybörjare
6004 2 Morgonridning
5911 3 J2
6467 3 J5
这就是我所期望的:
5887 1 J2
6555 2 Junior nybörjare
5911 3 J2
5916 1 J5
6004 2 Morgonridning
6467 3 J5
The first seven records should be ordererd by 1,2,3,4,5,6 and 7. And then it should start all over.
您可以使用 row_number()
:
order by row_number() over (partition by DATEPART(dw, date) order by tblridgruppevent.id),
datepart(dw, date)
第二个键保持组内的顺序。
您没有指定应如何为每个组选择行。从问题上看不清楚。
你可能会通过进一步缩小并考虑你正在尝试做什么以及你还可以如何做来获得一些价值。 SQL 往往在逐行处理以及某行从前一行借用详细信息的操作中表现非常差。如果您需要更改重复的范围(从 7 切换到 10 或 4 等),您也可能 运行 遇到问题。
如果您仍然需要一个有点随意的数字,您可以将 ROW_NUMBER 与模数相结合以获得重复增量,然后将其添加到您的 select/where 条件中。它看起来像这样:
((ROW_NUMBER() OVER(ORDER BY column ASC) -1) % 7) + 1 AS Number
外层的+1是将结果显示为1-7而不是0-6,内层的-1处理关闭一期(从2开始的列而不是1)。我觉得有更好的方法来处理这个问题,但目前我还没有想到。
编辑:再次查看您的 post,您似乎在处理星期几。即使未在 select 语句中显示,您也可以按日期排序,这可能是您需要的全部内容。
我正在编写一个查询,我希望它按系列进行排序。前七条记录应按 1、2、3、4、5、6 和 7 排序。然后它应该重新开始。
我试过分区,last_value但我想不通。
这是 SQL 代码:
set language swedish;
select
tblridgruppevent.id,
datepart(dw,date) as daynumber,
tblRidgrupper.name
from
tblRidgruppEvent
join
tblRidgrupper on tblRidgrupper.id = tblRidgruppEvent.ridgruppid
where
ridgruppid in (select id from tblRidgrupper
where corporationID = 309 and Removeddate is null)
and tblridgruppevent.terminID = (select id from tblTermin
where corporationID = 309 and removedDate is null and isActive = 1)
and tblridgrupper.removeddate is null
order by
datepart(dw, date)
这是一个结果示例:
5887 1 J2
5916 1 J5
6555 2 Junior nybörjare
6004 2 Morgonridning
5911 3 J2
6467 3 J5
这就是我所期望的:
5887 1 J2
6555 2 Junior nybörjare
5911 3 J2
5916 1 J5
6004 2 Morgonridning
6467 3 J5
The first seven records should be ordererd by 1,2,3,4,5,6 and 7. And then it should start all over.
您可以使用 row_number()
:
order by row_number() over (partition by DATEPART(dw, date) order by tblridgruppevent.id),
datepart(dw, date)
第二个键保持组内的顺序。
您没有指定应如何为每个组选择行。从问题上看不清楚。
你可能会通过进一步缩小并考虑你正在尝试做什么以及你还可以如何做来获得一些价值。 SQL 往往在逐行处理以及某行从前一行借用详细信息的操作中表现非常差。如果您需要更改重复的范围(从 7 切换到 10 或 4 等),您也可能 运行 遇到问题。
如果您仍然需要一个有点随意的数字,您可以将 ROW_NUMBER 与模数相结合以获得重复增量,然后将其添加到您的 select/where 条件中。它看起来像这样:
((ROW_NUMBER() OVER(ORDER BY column ASC) -1) % 7) + 1 AS Number
外层的+1是将结果显示为1-7而不是0-6,内层的-1处理关闭一期(从2开始的列而不是1)。我觉得有更好的方法来处理这个问题,但目前我还没有想到。
编辑:再次查看您的 post,您似乎在处理星期几。即使未在 select 语句中显示,您也可以按日期排序,这可能是您需要的全部内容。