4

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

无需编写 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 个条目。

4

3 回答 3

9

基于 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
于 2012-05-12T23:35:16.433 回答
2

我认为你需要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 ;
于 2012-05-12T23:43:50.373 回答
2

Raphaël Althaus 答案的扩展:

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;

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

于 2012-05-13T01:44:00.643 回答