我有一个历史记录表,它捕获对某个对象的更新,除了其他信息之外,还捕获此更新发生的时间。我想做的是SELECT
MIN(LogDate)
对应某个ActionTaken
专栏。
更具体地说,历史表可能有其他(更新的)行,其中 ActionTaken = 1
,但我想捕获日期 ActionTaken
变成了 1。
示例:
SELECT MIN(LogDate) AS FirstActionDate
FROM HistoryTable
WHERE ID = 123
AND FirstActionTaken = 1
SELECT MIN(LogDate) AS SecondActionDate
FROM HistoryTable
WHERE ID = 123
AND SecondActionTaken = 1
SELECT MIN(LogDate) AS ThirdActionDate
FROM HistoryTable
WHERE ID = 123
AND ThirdActionTaken = 1
这效果很好,我毫无问题地收到了正确的日期。我遇到麻烦的地方是 select
MAX(LogDate)
来自该组:
SELECT MAX(LogDate) AS LastActionDate
FROM HistoryTable
WHERE ID = 123
AND LogDate IN
(
( SELECT MIN(LogDate) AS FirstActionDate
FROM HistoryTable
WHERE ID = 123
AND FirstActionTaken = 1 ),
( SELECT MIN(LogDate) AS SecondActionDate
FROM HistoryTable
WHERE ID = 123
AND SecondActionTaken = 1 ),
( SELECT MIN(LogDate) AS ThirdActionDate
FROM HistoryTable
WHERE ID = 123
AND ThirdActionTaken = 1 )
)
这也有效,但我讨厌这样做。我可以将前面的语句保存到变量中,然后 SELECT MAX()
来自那些;它肯定会更具可读性,但是JOIN
会是什么?此查询的语法类似于?
有没有办法将前三个结合起来 SELECT
语句合并成一个返回所有三个日期的语句,这不是一团乱七八糟的东西吗?
我怎样才能获取最新的LogDate
(作为单独的列)来自此结果集,并且没有(看似不必要的)重复 SELECT
声明?
编辑:
以下是我找到的一些与迄今为止给出的答案相关的链接:
希望这些内容能够帮助其他人寻找类似问题的解决方案!
最佳答案
使用规范化的数据结构会更容易。这是一种使用条件聚合来计算三个最小日期的方法。然后取这些值中的最大值:
SELECT v.dt
FROM (SELECT MIN(CASE WHEN FirstActionTaken = 1 THEN LogDate END) AS d1,
MIN(CASE WHEN SecondActionTaken = 1 THEN LogDate END) AS d2,
MIN(CASE WHEN ThirdActionTaken = 1 THEN LogDate END) AS d3
FROM HistoryTable
WHERE ID = 123
) ht OUTER APPLY
(SELECT MAX(dt) as dt
FROM (VALUES (d1), (d2), (d3) ) v(dt)
) v;
关于sql - 在 SQL Server 中选择一组日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34205564/