【问题标题】:tsql - how to select 6th row from 1st row and then 6th from 6th row and so ontsql - 如何从第一行中选择第 6 行,然后从第 6 行中选择第 6 行,依此类推
【发布时间】:2014-08-15 13:12:50
【问题描述】:

我有这样的表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
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
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 中做到这一点,非常感谢任何帮助

【问题讨论】:

  • 不清楚应用了哪些规则来获取您的序列..
  • 你能解释一下这个模式吗,我想你只是希望序列与太阳或金星在一起,这取决于你通过哪一个?如果是这样,我认为您可以只使用 IF 条件,然后对您的序列进行硬编码。
  • 我正在尝试根据日期获取该序列,即星期一,星期二...如果我想查看星期一的行星顺序,那么它应该按照上述顺序返回行星,如果我选择 tue 来查看行星,然后我希望查看上面示例中显示的顺序。我将尝试使用 if 条件。谢谢
  • @user790049 并根据what rules 确定顺序吗?或者它只是固定的,比如如果你选择Moon 你会得到“这个订单”? (在这种情况下,您可以对其进行硬编码,我认为这会更容易)。

标签: sql-server-2008 tsql


【解决方案1】:

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

Planets 表稍作修改,使太阳从零开始,因为下一节读起来更清晰。

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

【讨论】:

  • 感谢 Mike,我放弃了这个并在我的数据库中创建了输出表。但是通过您的解决方案,我无需创建表格即可获得所需的输出。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多