我有一个包含三个日期字段的表格,一个开始日期,中期日期和结束日期。我想创建一个单一的查询来从表中获取最新的活动。在这种情况下,活动是在更新日期字段时。
无需编写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个条目。
答案 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)
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 ;