sql - 在同一列上按升序或降序有条件地排序

标签 sql sql-server sorting

我需要进行一个基于日期列排序的查询,并遵循以下规则:

  1. 第一个:NULL
  2. 然后:如果日期 >= CURRENT_TIMESTAMP,则按 ASC 排序
  3. 最后:如果日期 < CURRENT_TIMESTAMP,则按 DESC 排序

我有以下内容:

SELECT * FROM [Table]
ORDER BY (CASE WHEN [Date] IS NULL THEN 0 ELSE 1 END),
    (CASE WHEN [Date] >= CAST(CURRENT_TIMESTAMP AS DATE) THEN 0 ELSE 1 END),
    [Date] ASC

但这不会按降序返回早于今天日期的项目。我如何修改我的查询以满足所有三个要求?

最佳答案

我们可以将它们分组,并在第一个 order by 子句中对组进行排序。

   SELECT * 
    from test
    order by (case when [Date] is null then 0 
             when [Date] >= getdate() then 1 
             when [Date] < getdate() then 2 
             end ) asc ,
             case when [Date] >= getdate() then [Date] end asc,
             case when [Date] < getdate() then [Date] end desc

关于sql - 在同一列上按升序或降序有条件地排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27027805/

相关文章:

sql - 我们如何使用sql删除databricks笔记本中数据库下的所有表?

SQL - 如何删除两个相互引用的实体

sql-server - 在更新语句中获取最新的行版本/时间戳值 - Sql Server

php - 按推荐人排序(相当复杂)

python - NumPy:按非零条目数对矩阵行进行排序

java - jdbcTemplate query() 保证保持结果集顺序?

java - 避免在循环中执行数据库查询

SQL 到 Oracle 链接服务器 Openquery 检索单行

sql - 如何对 SQL 表列进行验证?

mysql - 使用 0/NULL 值进行归一化还是可以设计得更好?