基于同一表上的另一个查询过滤记录的 SQL
Posted
技术标签:
【中文标题】基于同一表上的另一个查询过滤记录的 SQL【英文标题】:SQL for filter records based on another query on the same table 【发布时间】:2013-05-14 07:45:05 【问题描述】:我有一个包含以下列的表格
-
试用 ID
积分
试用日期时间
用户ID
这代表用户进行的试验以及他在试验中获得的分数。 一个特定的用户可以进行 10 次试验,因此他的表中可能有 10 条记录。
我想获取所有分数超过 50 的记录,但前提是该试用代表该特定用户的第 4 次或更多试用。表中未列出特定试验的数量。但是,如果一个用户 ID 有 5 次试验,则可以使用 datetime 字段来确定哪个是第一个/第二个等。
所以基本上我想获得所有得分大于 50 的试验,并且相同的用户 ID 在表中有 3 个其他试验,其日期时间较短。
有没有办法通过 SQL 做到这一点?
我知道我可以得到
select * from tbl where points > 50;
我会得到所有点数 > 50 的记录,但是如何进一步过滤呢?
如果我有一个名为 X 的变量中特定记录的日期时间,我可以这样做
select count(TrialId) from tbl where TrialDateTime > 'somedatetime' and userid = 'someuid'.
检查同一个用户标识是否有超过 3 条旧记录。但是有没有办法使用 SQL 将这两者结合起来?我还有哪些其他选择?
样本记录
1. T1, 20, 2013-05-09 14:10:27.000, U1
2. T2, 40, 2013-05-09 14:20:27.000, U1
3. T3, 45, 2013-05-09 14:30:27.000, U1
4. T4, 60, 2013-05-09 14:40:27.000, U1
5. T5, 20, 2013-05-09 12:11:27.000, U2
6. T6, 30, 2013-05-09 12:12:27.000, U2
7. T7, 60, 2013-05-09 12:13:27.000, U2
8. T8, 40, 2013-05-09 12:54:27.000, U2
这里将选择记录 4。但是,记录 7 将不会被选中,尽管两者的分数都在 50 以上。
使用 SQL Server 2008 R2。
【问题讨论】:
你能提供样本记录吗? 你使用的是哪个 sql-server 版本? @JW웃 - 添加了示例记录。 @Arion - 使用 SQL Server 2008 R2。 【参考方案1】:可能是这样的:
;WITH CTE
AS
(
SELECT
ROW_NUMBER() OVER(PARTITION BY t.UserId
ORDER BY t.TrialDateTime) AS NbrOfTrails,
t.*
FROM
tbl AS t
)
SELECT
*
FROM
CTE
WHERE
CTE.NbrOfTrails > 3
AND CTE.Points > 50
参考资料:
Using Common Table Expressions
ROW_NUMBER (Transact-SQL)
【讨论】:
这对 SQL Server 2008 有依赖吗?即它可以在 SQL Server 2005 上运行吗? @user93353 :我已经用一些参考资料更新了答案。如果您阅读该链接,您会发现它与 2008 年没有依赖关系。它也将在 2005 年工作 谢谢。我问只是因为在 cmets 中你问我使用的是什么版本的 SQL Server。无论如何,我理解你的查询是如何工作的——我什至不知道这些事情在 SQL 中是可能的——ROW_NUMBER、Partition 和 With。我的 SQL 知识充其量只是基础知识。非常感谢。 @user93353 :我问是因为您是否会使用 mssql 2000。然后这些功能不可用。我知道相似之处很渺茫。但我必须确定。但我很乐意提供帮助【参考方案2】:我相信你可以做到以下几点:
SELECT
*
FROM
tbl as outertable
WHERE
points > 50 AND
(
SELECT
COUNT(*) AS Number
FROM
tbl as innertable
WHERE
innertable.UserID = outertable.UserID AND
innertable.TrialDateTime < outertable.TrialDateTime
) > 2
【讨论】:
以上是关于基于同一表上的另一个查询过滤记录的 SQL的主要内容,如果未能解决你的问题,请参考以下文章