当更新日期相同时,选择查询以获取最后一个用户更新的所有最后一行

Posted

技术标签:

【中文标题】当更新日期相同时,选择查询以获取最后一个用户更新的所有最后一行【英文标题】:SELECT query to fetch all last rows updated by last user when updated date is same 【发布时间】:2016-10-08 07:17:04 【问题描述】:

我正在使用 Oracle 11g 数据库。 假设我有一个包含四列的 SQL 表“评论”。当某些用户 cmet 时,对于该评论的每一行,都会将一行插入到表中。

lineNo | Comment          | updatedDate     | UpdateBy
-----------------------------------------------------------
1      | Comment line 1   |  23-May-16      |   Abhi
2      | Comment line 2   |  23-May-16      |   Abhi
3      | Comment line 3   |  23-May-16      |   Rohit
4      | Comment line 4   |  23-May-16      |   Malay
5      | Comment line 5   |  23-May-16      |   Malay
6      | Comment line 6   |  23-May-16      |   Abhi
7      | Comment line 7   |  23-May-16      |   Abhi
8      | Comment line 8   |  23-May-16      |   Abhi
9      | Comment line 4   |  23-May-16      |   Abhi

我想编写 SELECT 查询来获取最后一个用户更新的所有最后一行。在上述情况下,应获取 LineNo 6、7、8 和 9。更新日期相同。 我对数据库只有只读访问权限,不能将任何新列添加到组更新中。

有什么方法可以获取这些行吗?

【问题讨论】:

为什么1,2没有被选中?他们也在同一日期由Abhi 更新。 因为我只想要最后一个用户更新的最后一行。 【参考方案1】:

这个查询将给出最后一个评论者所做的最后一个 cmets,在你的情况下是 6/7/8/9

SELECT *
FROM "Comments"
WHERE "lineNo">
    ( SELECT max("line No")
     FROM "Comments"
     WHERE (UpdateBy,updatedDate)<>
         ( SELECT "UpdateBy","updatedDate"
          FROM "Comments"
          WHERE "lineNo"=
              (SELECT max("lineNo")
                   FROM "Comments") ))

修改了查询,因此如果最后一个评论者在 2 个不同的天(或更多天)发表评论,它将考虑最后一个评论天。

SqlFiddle 这里:http://www.sqlfiddle.com/#!9/91176e/1(mysql 兼容性,因为 Oracle fiddle 暂时有问题)

【讨论】:

【参考方案2】:

我想这就是你想要的。

SELECT Comments.* 
FROM (SELECT MAX(lineNo) AS maxLineNo, Comment FROM Comments GROUP BY Comment) as X 
INNER JOIN Comments ON (Comments.lineNo = X.maxLineNo AND Comments.Comment = X.Comment)

【讨论】:

以上是关于当更新日期相同时,选择查询以获取最后一个用户更新的所有最后一行的主要内容,如果未能解决你的问题,请参考以下文章

用户选择日期后无法显示“今天”,而不是今天的日期

将图表数据绑定到日期选择器以显示自定义时间线

批量更新数据不成功

SQL Server 2016 - 如何获取用户的最后登录日期?

更新表格上的记录

按具有相同值的值排序时定义的 SQL 行为