如何排序表的一部分?

时间:2014-09-11 12:39:28

标签: sql-server

我有一个包含“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 个答案:

答案 0 :(得分:6)

使用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)

SELECT * , 'OrderDate' = CASE ActionDate 
WHEN '01-01-1980' THEN 2
ELSE 1
END 
FROM YourTable
ORDER BY OrderDate, data

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

答案 2 :(得分:-1)

这样的事可能会这样做:

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'

答案 3 :(得分:-1)

由于1980-01-01是时间戳起始值,我认为您的日期会自动生成,以存储今天的日期&#39;当行动发生时,换句话说,没有低于1980-01-01的日期,在这种情况下,一个简单的订单可以完成任务(而且它的速度要快得多)

SELECT ActionDate
FROM [Your_Table]
ORDER BY ActionDate DESC