SQL替换年份排序

时间:2015-03-11 22:05:35

标签: sql sql-server sorting

现有数据:

RowId   Title   Year
1        Aaa    2002
2        Bbb    2003
3        Ccc    2004
4        Ddd    2004
5        Eee    2005
6        Fff    2006
7        Ggg    2007
8        Hhh    2008

我需要根据输入参数检索上表中的数据,如下所示:

    1.  Select all records matching param year
    2.  Select all records matching param year +1
    3.  Select all records matching param year -1
    4.  Select all records matching param year +2
    5.  Select all records matching param year -2
    6.  Select all records matching param year +3
    7.  Select all records matching param year -3

预期结果(假设参与年是2005年):

RowId   Title   Year
5        Eee    2005
6        Fff    2006
3        Ccc    2004
4        Ddd    2004
7        Ggg    2007
2        Bbb    2003
8        Hhh    2008
1        Aaa    2002

我能够使用UNION在同一个表上使用多个SELECT来实现它,但是想知道是否有更好的方法来实现它。

感谢您的帮助!

4 个答案:

答案 0 :(得分:3)

假设Year是一个整数:

declare @param int

select *
from mytable
where Year = @param
or Year = @param + 1
or Year = @param - 1
-- etc.
order by abs(Year - @param), Year - @param desc, Title

order by中的第一个条款按Year@param之间的差异大小排序,第二个条款确保在消极差异之前出现正差异。

答案 1 :(得分:1)

SELECT * FROM TableName
WHERE Year = @Year Or 
      Year = @Year - 1 Or 
      Year = @Year + 1 Or
      Year = @Year - 2 Or 
      Year = @Year + 2 Or
      Year = @Year - 3 Or 
      Year = @Year + 3 
ORDER BY ABS(Year - @Year)

答案 2 :(得分:0)

我会这样做:

select [Row], [Title], [Year], abs(year-2005) as thing
from table1
order by thing, year desc

小提琴:http://sqlfiddle.com/#!6/6e5e4/2

答案 3 :(得分:0)

您需要更改2005年的参数,但这应该有效

select rowid, title, year FROM
(
select rowid, title, year, (year - 2005) c1, ABS (year - 2005) c2  from a
  ) t1 
  order by t1.c2, t1.c1 desc

http://sqlfiddle.com/#!6/b42d0/4