2013-04-10 46 views
1

對於給定的用戶,我想創建一個SQL查詢,返回用戶每天獲得最佳值的時間。
我使用MySQL。計算幾個日期的最大值的數量

----------------------------- 
| User | Date | Value | 
----------------------------- 
| John | 2013-04-03 | 57 | 
| John | 2013-04-04 | 13 | 
| John | 2013-04-05 | 102 | 
| John | 2013-04-06 | 64 | 
| Bob | 2013-04-03 | 8  | 
| Bob | 2013-04-04 | 83 | 
| Bob | 2013-04-05 | 44 | 
| Bob | 2013-04-06 | 101 | 
| Paul | 2013-04-03 | 22 | 
| Paul | 2013-04-04 | 72 | 
| Paul | 2013-04-05 | 50 | 
| Paul | 2013-04-06 | 15 | 
----------------------------- 

實施例:
約翰:2次(2013年4月3日2013年4月5日&)
鮑勃:2次(2013年4月4日& 2013年4月6日)
保羅:0時間

我不知道我必須使用(COUNT(*)SUM(*)MAX(弗吉尼亞州哪些功能? lue)GROUP BY?)。
如何爲每個日期製作循環並製作總和?

+0

什麼[RDBMS](http://en.wikipedia.org/wiki/Relational_database_management_system)您使用的? 'RDBMS'代表*關係數據庫管理系統*。 'RDBMS是SQL'的基礎,並且適用於所有現代數據庫系統,如MS SQL Server,IBM DB2,Oracle,MySQL等...... – 2013-04-10 08:57:15

+0

你想在平局的情況下發生什麼? – 2013-04-10 09:00:34

+0

我忘了說。我使用MySQL。 – pihug12 2013-04-10 09:05:18

回答

0

既然你沒有提到你正在使用的RDBMS,這裏有一個查詢,將在工作幾乎所有 RDBMS:

SELECT aa.User, COUNT(bb.User) TotalCount 
FROM (SELECT DISTINCT User FROM TableName) aa 
     LEFT JOIN 
     (
      SELECT a.User 
      FROM TableName a 
        INNER JOIN 
        (
         SELECT Date, MAX(Value) max_val 
         FROM TableName 
         GROUP BY Date 
        ) b ON a.Date = b.Date AND 
          a.Value = b.max_val 
     ) bb ON aa.User = bb.User 
GROUP BY aa.User 

輸出

╔══════╦════════════╗ 
║ USER ║ TOTALCOUNT ║ 
╠══════╬════════════╣ 
║ Bob ║   2 ║ 
║ John ║   2 ║ 
║ Paul ║   0 ║ 
╚══════╩════════════╝ 
0

你可以試試看由於查詢來實現這一目標 -

WITH T AS (SELECT USER,COUNT(*) 
      FROM TABLE_NAME WHERE (DATE,VALUE) IN (SELECT DATE, MAX(VALUE) 
                 FROM TABLE_NAME 
                GROUP BY DATE) 
      GROUP BY USER) 

SELECT * FROM T 
UNION SELECT USER,0 
     FROM TABLE_NAME 
     WHERE USER NOT IN (SELECT USER FROM T) 
0

我想出了以下

select 
    u.user, count(*) as top_performer 
    from 
    my_table u 
    join (
     select valdate, max(value) as value 
     from my_table 
     group by valdate 
    ) mv on 
     mv.valdate = u.valdate and 
     mv.value = u.value 
    group by 
    u.user 

JW的答案,因爲它列出了保羅的零得分可能會更完整的 - 我的答案,而另一方面,假設你將left join給另一個用戶表。

http://sqlfiddle.com/#!2/409ca/11