【问题标题】:How to sort part of the table?如何对表格的一部分进行排序?
【发布时间】:2014-11-05 10:00:06
【问题描述】:

我有一个包含“ActionDate”列的表格,其中包含 2 种日期:

  • 一些不同的真实日期和
  • 常量值'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

【问题讨论】:

标签: sql-server


【解决方案1】:

使用CASE 语句创建订单

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

CASE 语句检查日期,当它是您的参考日期时,它分配值 1。在 OREDER BY 中使用时,这意味着标记为 0 的行将位于标记为 1 的行之前。

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

SQL Fiddle,其中包括排序字段,可帮助您查看正在发生的事情。

【讨论】:

  • 1和0是什么意思?
  • @tesicg - 答案已更新,我错过了关键字 WHEN,我添加了更多信息来回答您的评论。
【解决方案2】:
SELECT * , 'OrderDate' = CASE ActionDate 
WHEN '01-01-1980' THEN 2
ELSE 1
END 
FROM YourTable
ORDER BY OrderDate, data

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

【讨论】:

    【解决方案3】:

    这样的事情可能会做到:

    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'
    

    【讨论】:

    • 您不能在 UNION 语句之前使用 ORDER BY,此外,当您可以使用 CASE 在单个选择中完成所有操作时,为什么还要使用 UNION
    【解决方案4】:

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

    SELECT ActionDate
    FROM [Your_Table]
    ORDER BY ActionDate DESC
    

    【讨论】:

    • 错了——看看他们想要的输出。他们希望所有非 1980 年的日期按升序排列,然后是 1908 年的日期在底部。此外,这已经得到了回答和接受。
    • 是的,你是对的,抱歉,我没有注意到“升序”顺序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多