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(Value) ? GROUP BY ?)。
如何为每个日期创建一个循环并求和?

4

3 回答 3

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 ║
╚══════╩════════════╝
于 2013-04-10T09:02:17.533 回答
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)
于 2013-04-10T09:11:53.300 回答
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 的答案可能更完整,因为它列出了 Paul 的零分 - 另一方面,我的答案假设您将left join访问另一个用户表。

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

于 2013-04-10T09:43:13.833 回答