1

我有一个包含以下列的表格

  1. 试用 ID
  2. 积分
  3. 试用日期时间
  4. 用户身份

这代表用户进行的试验和他在试验中获得的分数。一个特定的用户可以进行 10 次试验,因此他可能在表中有 10 条记录。

我想获取所有分数超过 50 的记录,但前提是该试验代表该特定用户的第 4 次或更多试验。表中未列出特定试验的数量。但是,如果用户 ID 有 5 次试验,则可以使用日期时间字段来确定哪个是第一个/第二个等。

所以基本上我想获得分数大于 50 的所有试验,并且相同的用户 ID 在表中有 3 个其他试验,其日期时间较短。

有没有办法通过 SQL 做到这一点?

我知道我可以得到

select * from tbl where points > 50;

会给我所有积分> 50的记录,但我该如何进一步过滤呢?

如果我在名为 X 的变量中有特定记录的日期时间,我可以这样做

select count(TrialId) from tbl where TrialDateTime > 'somedatetime' and userid = 'someuid'.

检查同一个用户 ID 是否有超过 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。

4

2 回答 2

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

参考:

使用公用表表达式

ROW_NUMBER (Transact-SQL)

于 2013-05-14T07:56:58.477 回答
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
于 2013-05-14T08:13:37.243 回答