我有一个包含以下列的表
这表示由用户和他们完成的试验。他在审判中得分。 特定用户可以进行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。
答案 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
参考文献:
答案 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