【问题标题】:Oracle SQL: Selecting a single row with the latest date between multiple columnsOracle SQL:在多列之间选择具有最新日期的单行
【发布时间】:2013-06-01 19:48:19
【问题描述】:

我的基表结构如下所示:

创建表示例_表
{
ID NUMBER NOT NULL,
-- 这里的其他栏目,
CREATE_USER VARCHAR2(255 BYTE) NOT NULL,
CREATE_DATE DATE DEFAULT SYSDATE NOT NULL,
UPDATE_USER VARCHAR2(255 字节),
UPDATE_DATE日期
}

我想要做的是选择具有最高 update_date 或 create_date 的行的 id。所以像这样(虽然这不起作用 - pID 被定义为存储过程中的输出变量):

SELECT ID, MAX(GREATEST(CREATE_DATE, UPDATE_DATE) 作为 LAST_MODIFIED
FROM 示例表
将 ID 返回到 pID;

这将返回表中修改的最后一行的单个 id。一点帮助?

附:这是在 Oracle11g 中。我目前正在使用 MERGE 将行插入到表中,并使用此方法获取最后插入的行的 id。如果您对此有任何建设性的批评(可能有替代解决方案),我会全力以赴。我已经阅读了很多关于为什么这是好/坏的论点。我将在 c# 中调用此过程,因此欢迎提供任何其他提示。

【问题讨论】:

    标签: c# sql oracle stored-procedures


    【解决方案1】:

    我认为你想要的结构是这样的:

    select id
    from (SELECT ID
          FROM EXAMPLE_TABLE
          order by GREATEST(CREATE_DATE, UPDATE_DATE) desc
         )
    where rownum = 1
    

    但是,我认为其中一个日期可能为 NULL。如果是这样:

    select id
    from (SELECT ID
          FROM EXAMPLE_TABLE
          order by coalesce(GREATEST(CREATE_DATE, UPDATE_DATE), CREATE_DATE) desc
         )
    where rownum = 1
    

    这些查询按每行两个值中较大的一个排序,然后选择最大值。

    【讨论】:

    • 是的,这就是我要找的。想知道 Oracle 是否有比选择有序列表的第一行更快的方法。不过这会起作用:)
    • @craignewkirk。 . .如果性能是一个问题,请提出另一个问题。参考这个并提供有关数据大小的更多信息。
    【解决方案2】:

    使用所有日期字段创建所有 ID 的组合,然后使用 rownum 限制将它们最大化以仅获取第一个。

    WITH A AS (
        SELECT ID, Max(FirstDateField) AS value
        FROM TableName
                    WHERE ROWNUM=1
                    GROUP BY ID
                    ORDER BY Max(FirstDateField) DESC
        UNION ALL
        SELECT ID, Max(SecondDateField) AS value
        FROM TableName
                    WHERE ROWNUM=1
                    GROUP BY ID
                    ORDER BY Max(SecondDateField) DESC
    )
    SELECT ID 
    FROM A
    WHERE ROWNUM=1
    ORDER BY Value DESC
    

    【讨论】:

    • 嗨,达伦,感谢您的回答。你知道在大型数据集上哪个更快:你的还是 Gordon 的?
    • 我主要使用 SQL Server,但如果它确实以类似的方式做出反应,我刚刚所做的修改应该使其执行速度更快(将 WHERE ROWNUM=1 添加到每个分组的顶部查询中)。无论现在大小如何,索引日期字段对于创建此查询实例都是必不可少的。
    • 知道了 - 感谢更新。我还没有足够的声望来投票,但是一旦我这样做了,我就会投票给反馈。
    猜你喜欢
    • 2023-01-13
    • 2022-01-20
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多