sql - SQL查询,循环数据
问题描述
我有一个包含以下字段的数据库:UserID、DateRecorded 和 Score。
每次更新分数时都会向表中添加一个新条目。以下是用户记录的示例:
UserID | DateRecorded | Score
3 | 21-08-2019 | 10
3 | 23-08-2019 | 5
3 | 21-09-2019 | 10
3 | 21-08-2018 | 1
从查询中,我希望它只显示所有具有最早 DateRecorded 的用户的分数。
虽然对游标不太熟悉,但我尝试使用网上的一个示例并将其改编为我的,但这似乎并没有奏效。这是我对光标的尝试:
DECLARE @DateRecorded AS DATETIME;
DECLARE @scores AS FLOAT;
DECLARE @Cursor as CURSOR;
SET @Cursor = CURSOR FOR
select [user_id], [DateRecorded], scores
from myTable
where [user_id] = '55'
OPEN @Cursor
FETCH NEXT FROM @Cursor INTO @UserID, @DateRecorded, @scores;
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @UserID AS 'User ID', MIN(@DateRecorded) AS 'Date', @scores AS 'Score';
FETCH NEXT FROM @Cursor INTO @UserID, @DateRecorded, @scores;
END
CLOSE @Cursor;
DEALLOCATE @Cursor;
这是我期待的结果:
3 | 21-08-2018 | 1
有没有比使用游标更简单的方法?
我完全误解了游标吗?
谢谢你的帮助
解决方案
不要使用游标和循环(除非你别无选择):它们很复杂,而且非常慢。您在这里要求的内容可以通过直接的 SQL 查询来完成。
如果您只想要每个用户的最早记录日期而不需要其他信息,那么简单的聚合就足够了:
select UserIdD, min(DateRecorded) from mytable group by UserID
如果您想要每个用户的整个“第一条”记录,那么这是一个典型的每组最大 n 问题。一种方法是使用相关子查询进行过滤:
select t.*
from mytable t
where t.DateRecorded = (
select min(t1.DateRecorded) from mytable t1 where t1.UserID = t.UserID
)
您可能还喜欢反left join
解决方案:
select t.*
from mytable t
left join mytable t1 on t1.UserID = t.UserID and t1.DateRecorded < t.DateRecorded
where t1.UserID is null
推荐阅读
- mongodb - 将来自 2 个 mongoDB 集合的数据合并到 1 个文档中
- python - 如何通过它们在 Python 中包含的文件类型(递归)来组织目录中的文件夹?
- python - python - chromedriver.exe 的路径(在服务器上运行)
- docker - 从 CLI 创建参数化 GitLab 个人访问令牌
- azure-active-directory - 有没有办法通过 Powershell 分配 Office 365 管理 API 应用程序权限?
- java - 使用 sqlite-jdbc-crypt 保护现有的 sqlite 数据库会引发 sqlite 错误或缺少数据库(不支持的文件格式)
- php - 并排的桌子
- node.js - Typescript 两个功能兼容的泛型
- javascript - 使用 Javascript RegExp 的自定义 URL 验证
- python - 重复符号后解析一个单词