gpt4 book ai didi

sql - 在 SQL Server 中选择一组日期

转载 作者:行者123 更新时间:2023-12-02 19:20:50 25 4
gpt4 key购买 nike

我有一个历史记录表,它捕获对某个对象的更新,除了其他信息之外,还捕获此更新发生的时间。我想做的是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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com