基于同一表上的另一个查询过滤记录的 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的主要内容,如果未能解决你的问题,请参考以下文章

vbscript 过滤同一工作表上的所有数据透视表

将数据添加到主表上的多个记录的链接表中

使用 2GB+ 加速单个表上的 SQL 查询

查询根据发布日期过滤订单?

Excel 2013 - 在基于 OLAP 的数据透视表上更改页面过滤器时记录的宏错误

同一查询中的火花计数和过滤计数