tsql - 如何从第1行选择第6行,然后从第6行选择第6行,依此类推

时间:2014-08-15 03:35:53

标签: sql-server-2008 tsql

我有这样的表planets

id  Planet Name
---------------
1   Sun     Sun
2   Moon    Mon
3   Mars    Tue
4   Mercury Wed
5   Jupiter Thu
6   Venus   Fri
7   Saturn  Sat

如果我选择' Sun'然后我希望我的查询返回

Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury

如果我选择'周一'然后我希望我的查询返回

Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter

如果我选择'星期二'然后我希望我的查询返回

Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus

如果我选择' Wed'然后我希望我的查询返回

Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn

如果我选择'周四'然后我希望我的查询返回

Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun

如果我选择'周五'然后我希望我的查询返回

Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon

如果我选择周六'然后我希望我的查询返回

Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars

老实说,我试图获得但是我能够使用excel实现这一点,但不知道如何在SQL中做任何帮助非常感谢

1 个答案:

答案 0 :(得分:2)

我创建了一个SQL Fiddle来构建您尝试构建的序列。

Planets表略有改动,让Sun从零开始,因为下一部分读的更清晰。

Create Table dbo.Planets 
(
  id int not null primary key
  ,planet nvarchar(20) not null
  ,day nvarchar(3) not null  
);
Go

Insert dbo.Planets
Values
 (0,'Sun','Sun') -- (Not really a planet...)
,(1,'Moon','Mon')
,(2,'Mars','Tue')
,(3,'Mercury','Wed')
,(4,'Jupiter','Thu')
,(5,'Venus','Fri')
,(6,'Saturn','Sat');
-- (...looks like Uranus didn't make the cut.)
Go

诀窍是只使用common table expression进行迭代,并了解modulo%)的工作原理。

With PlanetSequence As
(
  Select id
    ,planet
    ,day
    ,iterations = 0
  From dbo.Planets
  Where day = 'Sun' -- Could pass in a parameter here

  Union All

  -- As the recursive section of this CTE, this is 
  -- responsible for selecting the next item in
  -- in the sequence.
  Select  Planets.id
    ,Planets.planet
    ,Planets.day
    ,iterations = PlanetSequence.iterations + 1
  From dbo.Planets
    Join PlanetSequence
    On (PlanetSequence.id + 5) % 7 = Planets.id
  Where PlanetSequence.iterations < 20
)

Select Planet From PlanetSequence

结果:

PLANET
--------
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars
Sun
Venus
Mercury
Moon
Saturn
Jupiter
Mars