代码之家  ›  专栏  ›  技术社区  ›  tesicg

如何对表格的一部分进行排序?

  •  0
  • tesicg  · 技术社区  · 12 年前

    我有一个列为“ActionDate”的表,其中包含两种类型的日期:

    • 一些不同的真实日期和
    • 常量值‘1980-01-01’

    我需要以这样一种方式对数据进行排序,即实际日期应该以升序排列,常量值应该在其后。

    数据示例:

    1) 当前状态:

    ActionDate
    
    2014-01-03
    2014-01-01
    2014-01-02
    1980-01-01
    2014-01-04
    2014-01-05
    1980-01-01
    

    2) 所需状态:

    ActionDate
    
    2014-01-01
    2014-01-02
    2014-01-03
    2014-01-04
    2014-01-05
    1980-01-01
    1980-01-01
    
    4 回复  |  直到 12 年前
        1
  •  6
  •   Tony    12 年前

    使用 CASE 创建订单的语句

    SELECT ActionDate
    FROM [Your_Table]
    ORDER BY CASE WHEN ActionDate = '01-01-1980' THEN 1 ELSE 0 END, ActionDate
    

    这个 案例 语句检查日期,当它是您的参考日期时,它将赋值1。当用于 OREDER BY 这意味着标记为0的行将在标记为1的行之前。

    第二部分 ORDER BY 使用自然日期排序将它们从最早到最新排序。

    SQL Fiddle 其中包括排序顺序字段,以帮助您了解正在发生的情况。

        2
  •  0
  •   CiucaS    12 年前
    SELECT * , 'OrderDate' = CASE ActionDate 
    WHEN '01-01-1980' THEN 2
    ELSE 1
    END 
    FROM YourTable
    ORDER BY OrderDate, data
    

    在我的解决方案中,我创建了一个OrderDate列,其值为1或2,所有真实数据的值为1,“01-01-1980”的值为2,然后可以在该列之后和数据列之后对它们进行排序。

        3
  •  -1
  •   Patrick Tucci    12 年前

    像这样的事情可能会做到:

    SELECT ActionDate
    FROM dbo.MyTable
    WHERE ActionDate <> '01/01/1980'
    ORDER BY ActionDate
    
    UNION ALL 
    
    SELECT ActionDate
    FROM dbo.MyTable
    WHERE ActionDate = '01/01/1980'
    
        4
  •  -1
  •   Amine Horseman    12 年前

    由于1980-01-01是时间戳的起始值,我假设您的日期是自动生成的,以在操作发生时存储“今天的日期”,换句话说,没有低于1980-01-0的日期,在这种情况下,简单的排序方式可以完成任务(而且速度更快)

    SELECT ActionDate
    FROM [Your_Table]
    ORDER BY ActionDate DESC