Sql查询需要将多个日期列排序在一起

时间:2012-05-12 23:27:18

标签: sql sql-server select sql-order-by

我有一个包含三个日期字段的表格,一个开始日期,中期日期和结束日期。我想创建一个单一的查询来从表中获取最新的活动。在这种情况下,活动是在更新日期字段时。

无需编写3个单独的查询,然后将我的代码中的值组合起来获取10个最近的活动,我可以在一个查询中执行此操作。所以现在我有

    SELECT TOP 10 * FROM core_table 
    ORDER BY [start_date] Desc

    SELECT TOP 10 * FROM core_table 
    ORDER BY [process_date] Desc

    SELECT TOP 10 * FROM core_table 
    ORDER BY [archive_date] Desc

所以我想把这三个查询的结果拉到一起,根据所有三个日期得到前10个条目。

3 个答案:

答案 0 :(得分:6)

基于Itiong_sh给出的答案,它不完全相同:你可以在ORDER BY中做到

select top 10 * from core_table
order by
  CASE
      WHEN start_date >= process_date AND start_date >= archive_date 
          THEN  start_date
      WHEN process_date >= archive_date 
          THEN  process_date
      ELSE  archive_date
  END
 DESC

答案 1 :(得分:2)

Raphaël Althaus' answer上的扩展:

CREATE TABLE core_table (
    ...
    max_date AS
        CASE
            WHEN start_date >= process_date AND start_date >= archive_date
                THEN start_date
            WHEN process_date >= archive_date
                THEN process_date
            ELSE archive_date
        END
);

CREATE INDEX core_table_ie1 ON core_table (max_date);

然后,你可以简单地......

SELECT TOP 10 *
FROM core_table
ORDER BY max_date DESC;

...它应该使用索引范围扫描而不是全表扫描。

答案 2 :(得分:1)

我认为你需要UNION

SELECT TOP 10               
    *
FROM
    (   ( SELECT TOP 10 
              *, start_date    AS activity_date
          FROM core_table 
          ORDER BY [start_date] DESC
        ) 
    UNION
        ( SELECT TOP 10 
              *, process_date  AS activity_date
          FROM core_table 
          ORDER BY [process_date] DESC
        ) 
    UNION
        ( SELECT TOP 10 
              *, archive_date  AS activity_date
          FROM core_table 
          ORDER BY [archive_date] DESC
        )
    ) AS t
ORDER BY activity_date DESC ;