Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于同一表上的另一个查询筛选记录的SQL_Sql_Sql Server_Sql Server 2008 R2 - Fatal编程技术网

基于同一表上的另一个查询筛选记录的SQL

基于同一表上的另一个查询筛选记录的SQL,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我有一个包含以下列的表 特里利德 要点 三醛化时间 用户ID 这表示用户进行的试验&他在试验中获得的分数。 一个特定的用户可以进行10次试验,因此他在表中可能有10条记录 我想获得分数大于50的所有记录,但前提是该试验代表该特定用户的第四次或更多试验。表中未显示特定试验的编号。但是,如果一个用户ID有5次试用,那么datetime字段可以用来确定哪一次是第一次/第二次等 所以基本上我想得到所有得分大于50的试验&同一个用户id在表中还有其他3个试验,它们的日期时间较短 有没有办法通过SQL实现这

我有一个包含以下列的表

特里利德 要点 三醛化时间 用户ID 这表示用户进行的试验&他在试验中获得的分数。 一个特定的用户可以进行10次试验,因此他在表中可能有10条记录

我想获得分数大于50的所有记录,但前提是该试验代表该特定用户的第四次或更多试验。表中未显示特定试验的编号。但是,如果一个用户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。

可能类似以下内容:

;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
参考资料:


我相信你可以做到以下几点:

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 server版本?@JW웃 - 添加了示例记录。@Arion-使用SQL Server 2008 R2。这是否依赖于SQL Server 2008?i、 e.它在SQL Server 2005上可以工作吗?@user93353:我已经用一些参考资料更新了答案。如果您阅读了该链接,您将看到它与2008没有任何依赖关系。它也将在2005年起作用。谢谢。我这样问是因为在评论中你问我使用的是什么版本的SQL Server。无论如何,我理解了您的查询是如何工作的——我甚至不知道在SQL行数、分区和With中可能会出现这种情况。我的SQL知识充其量只是基础知识。非常感谢。@user93353:我这样问是因为您是否愿意使用mssql 2000。那么这些功能就不可用了。我知道这些肖像很苗条。但我必须确定。但我很乐意帮忙