1

次の列を持つテーブルがあります

  1. トライアル ID
  2. ポイント
  3. TrialDateTime
  4. ユーザーID

これは、ユーザーが行ったトライアルと、トライアルで獲得したポイントを表します。特定のユーザーが 10 回の試行を行う可能性があるため、テーブルには 10 個のレコードが含まれる場合があります。

ポイントが 50 を超えるすべてのレコードを取得したいのですが、そのトライアルがその特定のユーザーの 4 回目以降のトライアルである場合に限ります。特定の試行回数は表に示していません。ただし、ユーザー ID に 5 回の試行がある場合、datetime フィールドを使用して、どちらが 1 回目か 2 回目かなどを判断できます。

したがって、基本的には、スコアが 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 に答える