2

特定の日に実行されたプレーヤーのステップに関する情報を含むテーブルがあります。合計の高い日の前日にそのプレーヤーの値が追加されたときに、データベースから最も高い3つの合計を取得したいと思います。一部のプレーヤーは毎日ログに記録するのではなく、1つの更新に複数日をまとめているためです。

データ構造:

|---------------------------------------------------------------|
| id | player_id | steps | date       | submitted               |
|----|-----------|-------|------------|-------------------------|
| 1  | 16        | 5718  | 2012-09-06 | 2012-09-10 08:31:35.000 |
| 2  | 16        | 9837  | 2012-09-07 | 2012-09-10 08:31:17.000 |
| 3  | 16        | 10432 | 2012-09-09 | 2012-09-10 08:30:54.000 |
| 4  | 30        | 3973  | 2012-09-07 | 2012-09-10 09:34:42.000 |
| 5  | 30        | 7104  | 2012-09-08 | 2012-09-10 09:35:05.000 |
| 6  | 30        | 10916 | 2012-09-09 | 2012-09-10 09:35:29.000 |
| 7  | 9         | 6437  | 2012-09-07 | 2012-09-10 09:39:15.000 |
| 8  | 9         | 9032  | 2012-09-08 | 2012-09-10 09:40:02.000 |
|---------------------------------------------------------------|

だから私が返したいのは行です:

|---------------------------------------------------------------|
| 6  | 30        | 10916 | 2012-09-09 | 2012-09-10 09:35:29.000 |
| 2  | 16        | 9837  | 2012-09-07 | 2012-09-10 08:31:17.000 |
| 8  | 9         | 9032  | 2012-09-08 | 2012-09-10 09:40:02.000 |
|---------------------------------------------------------------|

私のクエリは現在:

SELECT TOP 3 p.name,
             player_id,
             steps,
             date
FROM   steppers_step_log
       JOIN steppers_players P
         ON player_id = P.id
ORDER  BY steps DESC 

これは、ステップの上位3つより前の日付のエントリがあるかどうかを考慮していません。現在のフォームのクエリでは、上位のステップとして10432、10916、および9837が返されます。

前日にそのplayer_idのエントリがあることを確認するために、WHEREコマンドを実行する方法を理解するのに問題があり、それを機能させるための助けをいただければ幸いです。

4

3 に答える 3

3

このようなもの?

SELECT TOP 3 p.name,
             player_id,
             steps,
             date
FROM   steppers_step_log
       JOIN steppers_players P
         ON player_id = P.id
WHERE EXISTS
(
   SELECT 1 FROM steppers_step_log ssp
   WHERE ssp.player_id = P.id
   AND date = DATEADD(day, -1, steppers_step_log.date)
)
ORDER  BY steps DESC 

DATEADD (Transact-SQL)

于 2012-10-25T15:22:27.760 に答える
1

これを解決するにはいくつかの方法があります。他の人はおそらく、結合/存在タイプのクエリで解決策を実行します。ランキング関数を使用して適切な行を取得する別のアプローチが好きです。

探しているのは一連のアップロードであり、最初のアップロードは必要ありません。プレーヤーの行を列挙することで、シーケンスを定義できます。次に、各シーケンスについて、日付とシーケンスの差は一定です。次に、追加のランキングで必要なものが得られます。

順序を定義するには:

select stl.*,
       row_number() over (partition by player_id, groupid order by date) as seqnum
from (select stl.*,
             datediff(day, date,
                      row_number() over (partition by player_id order by date) as groupid
      from steppers_step_log stl
     ) stl

これで、次を使用して「適格な」行を取得できます。

where seqnum > 1

各プレーヤーの上位 3 つの値を取得するには、次のようにします。

with stl as (<above query>)
select *
from (select stl.*,
             row_number() over (partition by player_id order by steps desc) as scorenum
      from stl
      where seqnum > 1
     ) stl
where scorenum <= 3
于 2012-10-25T15:30:01.733 に答える
1

WHERE条件を使用して句を追加するだけEXISTSです...

SELECT TOP 3
  p.name,
  player_id,
  steps,
  date
FROM
  steppers_step_log    AS log
INNER JOIN
  steppers_players     AS players
     ON log.player_id = players.id
WHERE
  EXISTS (
    SELECT *
      FROM steppers_step_log
     WHERE player_id = players.id
       AND date      = log.date - 1
  )
ORDER BY
  log.steps DESC 

ただし、これ同じプレーヤーを複数回返す可能性があります。トップ 3 に複数のエントリがある場合。それでよろしいですか?

于 2012-10-25T15:24:35.010 に答える