SQL用于基于同一表上的另一个查询的过滤器记录

时间:2013-05-14 07:45:06

标签: sql sql-server sql-server-2008-r2

我有一个包含以下列的表

  1. TrialId
  2. TrialDateTime
  3. 用户ID
  4. 这表示由用户和他们完成的试验。他在审判中得分。 特定用户可以进行10次试验,因此表中可能有10条记录。

    我想获得点数大于50的所有记录,但仅当该试验代表该特定用户的第四次或更多次试验时。表中未列出特定试验的编号。但是,如果用户标识有5个试验,则可以使用日期时间字段来确定哪个是第一个/第二个等。

    所以基本上我想得到分数大于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。但是,虽然两者的分数都高于50,但不会选择记录7。

    使用SQL Server 2008 R2。

2 个答案:

答案 0 :(得分:3)

也许是这样的:

;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)

答案 1 :(得分:0)

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

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