【问题标题】:SQL SORT BY ALTERNATE YEARSQL 按隔年排序
【发布时间】:2015-05-13 22:21:17
【问题描述】:

现有数据:

RowId 标题年份 1 AAA 2002 2 BBB 2003 3 CCC 2004 4 Ddd 2004 5 易 2005 6 FFF 2006 7 吉格 2007 8 小时 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 标题年份 5 易 2005 6 FFF 2006 3 CCC 2004 4 Ddd 2004 7 吉格 2007 2 BBB 2003 8 小时 2008 1 AAA 2002

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

感谢您的帮助!

【问题讨论】:

    标签: sql sql-server sorting


    【解决方案1】:

    假设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 之间差异的大小排序,第二个子句确保正面差异先于负面差异。

    【讨论】:

    • 感谢您的快速回复!
    【解决方案2】:
    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)
    

    【讨论】:

    • where 子句真的很冗长:where Year between (@year - 3) and (@year + 3) 应该这样做。此外,order by 子句还不够。考虑@year = 2006 的情况。ABS(@year - 2005)ABS(@year - 2007) 都产生 1,因此它们被 order by 子句视为相等,因此可以按任何顺序返回。如果您输入年份的第二个排序标准,那就应该这样做。
    • @BenThul,是的,你是对的。这是通过垫张贴的,所以我无法测试它。
    【解决方案3】:

    我会这样做:

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

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

    【讨论】:

      【解决方案4】:

      您需要将 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-17
        • 2023-04-08
        • 1970-01-01
        • 2018-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多