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

标签 sql sql-server

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

相关文章:

c# - 在 Entity Framework 中使用事务或锁定来确保正确操作

sql - 查询表中每列的填充行数 (SQL Server)

java - 当PreparedStatement.execute()完成时,这并不意味着我的sql server过程结束了?

sql - 获取每年的数据计数,包括开始日期和结束日期

php - 使用php计算表中的行数

php - 多个客户表或大型整体表

MySQL - 如何将数据库组织到文件夹中

SQL Server - 根据 ID 和计算机名查找以前的记录

sql-server - SQL Server Integration Services SSIS 2005 - 如何让用户运行包?

单 View SQL SSAS Cube,处理cube时获取属性键找不到?