2

次のような MYSQL テーブルがあります。

  id |  userid  |  score  |      datestamp      |
-----------------------------------------------------
  1  |    1     |   5     |  2012-12-06 03:55:16
  2  |    2     |   0,5   |  2012-12-06 04:25:21
  3  |    1     |   7     |  2012-12-06 04:35:33
  4  |    3     |   12    |  2012-12-06 04:55:45
  5  |    2     |   22    |  2012-12-06 05:25:11
  6  |    1     |   16,5  |  2012-12-06 05:55:21
  7  |    1     |   19    |  2012-12-06 13:55:16
  8  |    2     |   8,5   |  2012-12-07 06:27:16
  9  |    2     |   7,5   |  2012-12-07 08:33:16
  10 |    1     |   10    |  2012-12-07 09:25:19
  11 |    1     |   6,5   |  2012-12-07 13:33:16
  12 |    3     |   6     |  2012-12-07 15:45:44
  13 |    2     |   4     |  2012-12-07 16:05:16
  14 |    2     |   34    |  2012-12-07 18:33:55
  15 |    2     |   22    |  2012-12-07 18:42:11

ユーザー スコアを次のように表示したいと思います。特定の日のユーザーが 3 つ以上のスコアを持っている場合、最も高い 3 つだけを取得し、このユーザーについて毎日それを繰り返し、すべての日を合計します。この合計をすべてのユーザーに表示したいと思います。

編集: 上記の例では、06.12 のユーザー 1 です。上位 3 つのスコアを合計し、4 番目のスコアを無視して、その数に翌日の上位 3 を追加します。すべてのユーザーにその番号が必要です。

編集 2: 期待される出力は次のとおりです。

  userid |   score  
--------------------
    1    |    59    //19 + 16.5 + 7 (06.12.) + 10 + 6.5 (07.12.)
    2    |    87    //22 + 0.5 (06.12.) + 34 + 22 + 8.5 (07.12.)
    3    |    18    //12 (06.12.) + 6 (07.12.)

これがより明確になることを願っています:)

私は立ち往生しているので、助けていただければ幸いです。

4

2 に答える 2

2

私のコメントに対するあなたの答えが次の場合は、次のコードを見てくださいyes:) あなたのデータはすべて 2012 年と 11 月なので、私は 1 日かかりました。

クエリ:

select y.id, y.userid, y.score, y.datestamp 
from (select id, userid, score, datestamp 
      from scores
      group by day(datestamp)) as y    
where (select count(*) 
       from (select id, userid, score, datestamp
             from scores group by day(datestamp)) as x
       where y.score >= x.score
       and y.userid = x.userid
      ) =1 -- Top 3rd, 2nd, 1st    
order by y.score desc
;

結果:

ID  USERID  SCORE   DATESTAMP
8   2       8.5 December, 07 2012 00:00:00+0000
20  3       6   December, 08 2012 00:00:00+0000
1   1       5   December, 06 2012 00:00:00+0000

質問に対するあなたの後の更新に基づいています。年/月/日ごとにユーザーごとにいくつか必要で、最も高いものを見つける場合はsum、上記のクエリのような集計関数を追加するだけです。繰り返しますが、サンプル データは 1 年間のものであり、年または月ごとのポイント グループはありません。それが私が日を取った理由です。

select y.id, y.userid, y.score, y.datestamp 
from (select id, userid, sum(score) as score,
      datestamp 
from scores
group by userid, day(datestamp)) as y    
where (select count(*) 
from (select id, userid, sum(score) as score
      , datestamp
from scores
group by userid, day(datestamp)) as x
where y.score >= x.score
and y.userid = x.userid
) =1 -- Top 3rd, 2nd, 1st    
order by y.score desc
;

合計に基づく結果:

ID  USERID  SCORE   DATESTAMP
1   1       47.5    December, 06 2012 00:00:00+0000
8   2       16      December, 07 2012 00:00:00+0000
20  3       6       December, 08 2012 00:00:00+0000

新しいソース データ サンプルで更新

サイモン、私のサンプルを見てください。あなたのデータが変化していたので、私は私のものを使用しました。ここに参照があります。またはansiなしで純粋なスタイルを使用しました。また、私が使用したデータは、上位 3 点ではなく上位 2 点であることに注意してください。それに応じて変更できます。over partitiondense_rank

答えは、最初のデータが与えた第一印象よりも 10 倍簡単だと思います....

SQLFIDDLE

1 へのクエリ: -- 各日ごとのユーザー別上位 2 件の合計

SELECT userid, sum(Score), datestamp
FROM scores t1
where 2 >=
(SELECT count(*) 
 from scores t2
 where t1.score <= t2.score
 and t1.userid = t2.userid
 and day(t1.datestamp) = day(t2.datestamp)
 order by t2.score desc)
group by userid, datestamp 
;

クエリ 1 の結果:

USERID  SUM(SCORE)  DATESTAMP
1       70      December, 06 2012 00:00:00+0000
1       30      December, 07 2012 00:00:00+0000
2       22      December, 06 2012 00:00:00+0000
2       25      December, 07 2012 00:00:00+0000
3       30      December, 06 2012 00:00:00+0000
3       30      December, 07 2012 00:00:00+0000

最終クエリ: -- 2 日間すべてのユーザー別上位 2 件の合計

SELECT userid, sum(Score)
FROM scores t1
where 2 >=
(SELECT count(*) 
 from scores t2
 where t1.score <= t2.score
 and t1.userid = t2.userid
 and day(t1.datestamp) = day(t2.datestamp)
 order by t2.score desc)
group by userid
;

最終結果:

USERID  SUM(SCORE)
1      100
2      47
3      60

これは、私が使用したデータの直接計算のスナップショットです。

ここに画像の説明を入力

于 2012-12-07T13:45:40.593 に答える
0
SELECT 
    * 
FROM
    table1
LEFT JOIN 
    (SELECT * FROM table1 ORDER BY score LIMIT 3) as lr on DATE(lr.datestamp) = DATE(table1.datastamp)
GROUP BY 
    datestamp   
于 2012-12-07T13:17:59.180 に答える