- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题源于关于是否在 particular case 中使用 SQL 排名功能的讨论。
任何常见的 RDBMS 都包含一些排名功能,即其查询语言具有 TOP n ... ORDER BY key
、 ROW_NUMBER() OVER (ORDER BY key)
或 ORDER BY key LIMIT n
( overview ) 等元素。
如果您只想显示大量记录中的一小部分,它们在提高性能方面做得很好。但它们也引入了一个主要陷阱:如果 key
不是唯一的,结果是不确定的。考虑以下示例:
users
user_id name
1 John
2 Paul
3 George
4 Ringo
logins
login_id user_id login_date
1 4 2009-08-17
2 1 2009-08-18
3 2 2009-08-19
4 3 2009-08-20
SELECT TOP 1 users.*
FROM
logins JOIN
users ON logins.user_id = users.user_id
ORDER BY logins.login_date DESC
George
并且一切看起来都很好。但是随后将一条新记录插入到
logins
表中:
1 4 2009-08-17
2 1 2009-08-18
3 2 2009-08-19
4 3 2009-08-20
5 4 2009-08-20
Ringo
?
George
?你不能说。据我所知,例如MySQL 4.1 返回物理创建的符合条件的第一条记录,即结果将是
George
。但这可能因版本和 DBMS 的不同而异。什么应该被退回?人们可能会说
Ringo
,因为他显然是最后登录的,但这是纯粹的解释。在我看来,两者都应该返回,因为您无法从可用数据中明确决定。
SELECT users.*
FROM
logins JOIN
users ON
logins.user_id = users.user_id AND
logins.login_date = (
SELECT max(logins.login_date)
FROM
logins JOIN
users ON logins.user_id = users.user_id)
TOP n WITH TIES ... ORDER BY key
(由
gbn 建议)、
RANK
和
DENSE_RANK
)。
ROW_NUMBER
你会发现许多建议使用排名功能的解决方案,并没有指出可能的问题。
最佳答案
rank
和 row_number
是很棒的函数,应该更自由地使用,IMO。人们只是不知道他们。
话虽如此,您需要确保您的排名依据是独一无二的。为重复项(尤其是日期)制定备份计划。您返回的数据与您输入的数据一样好。
我认为这里的陷阱在查询中完全相同:
select top 2 * from tblA order by date desc
关于sql - 是否应将 SQL 排名功能视为 "use with caution",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1305325/
我注意到,在 github 中的拉取请求中,它现在显示“谨慎合并”,同时仍然允许我自动合并。似乎与https://circleci.com有关,上面的 Failed(details) 链接重定向到该位
我正在尝试从存档中解压缩特定文件。 步骤: zip 结构 Archive: folder/jce_policy-6.zip 9101 bytes 5 files drwxr-xr-x 2
这个问题源于关于是否在 particular case 中使用 SQL 排名功能的讨论。 任何常见的 RDBMS 都包含一些排名功能,即其查询语言具有 TOP n ... ORDER BY key 、
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: How does this bash fork bomb work? 今天我的一个 friend 告诉我一件有趣的事
我正面临与加载相关的问题 JSON 数据。 当我监控时 JSON 调用 Chrome 的开发人员工具,我在 Chrome 开发人员工具的网络选项卡中收到以下消息。 Caution: request i
我只是想学习一些 Lisp,所以我正在解决项目欧拉问题。我发现问题没有。 14 个有趣的问题(所以如果你打算解决这个问题,请停止阅读,因为我把我的解决方案粘贴在了底部)。使用我的算法它是如此缓慢,但在
我在使用 Google chrome 检查器 (F12) 查看下载的资源时注意到一条奇怪的警告消息: Caution provisional headers are shown 我发现了一些可能相关的
我正在尝试学习 Objective C,但我的其中一个类(class)的代码有错误,我不知道如何解决。代码: // AppController.m #import "AppController.
我有一个包含敏感信息的存储库,因此在 GitHub 中我将其设为私有(private)。但是,这样做之后,现在会显示此消息: Caution: This repository is private b
我是一名优秀的程序员,十分优秀!