SQL查询 - 分组数据

时间:2012-02-08 10:46:27

标签: sql

所以每天早上上班时我们都会举行一次站立会议。我们把最近的物体扔到房间里,作为决定谁说话的方法。有点奇怪,我觉得获得这些投掷的一些数据可能很有趣。因此,每天早上我都会记住投掷的顺序(以及其他相关的事情,例如谁丢球/奇怪的海绵物体,这可能曾经是一个球,谁投掷给已经存在或刚刚投掷过的人) ,并将这些数据记录在表格中:

+---------+-----+------------+----------+---------+----------+--------+--------------+
| throwid | day |    date    | thrownum | thrower | receiver | caught | correctthrow |
+---------+-----+------------+----------+---------+----------+--------+--------------+
|       1 |   1 | 10/01/2012 |        1 | dan     | steve    |      1 |            1 |
|       2 |   1 | 10/01/2012 |        2 | steve   | alice    |      1 |            1 |
|       3 |   1 | 10/01/2012 |        3 | alice   | matt     |      1 |            1 |
|       4 |   1 | 10/01/2012 |        4 | matt    | justin   |      1 |            1 |
|       5 |   1 | 10/01/2012 |        5 | justin  | arif     |      1 |            1 |
|       6 |   1 | 10/01/2012 |        6 | arif    | pete     |      1 |            1 |
|       7 |   1 | 10/01/2012 |        7 | pete    | greg     |      0 |            1 |
|       8 |   1 | 10/01/2012 |        8 | greg    | alan     |      1 |            1 |
|       9 |   1 | 10/01/2012 |        9 | alan    | david    |      1 |            1 |
|      10 |   1 | 10/01/2012 |       10 | david   | dan      |      1 |            1 |
|      11 |   2 | 11/01/2012 |        1 | dan     | david    |      1 |            1 |
|      12 |   2 | 11/01/2012 |        2 | david   | alice    |      1 |            1 |
|      13 |   2 | 11/01/2012 |        3 | alice   | steve    |      1 |            1 |
|      14 |   2 | 11/01/2012 |        4 | steve   | arif     |      1 |            1 |
|      15 |   2 | 11/01/2012 |        5 | arif    | pete     |      0 |            1 |
|      16 |   2 | 11/01/2012 |        6 | pete    | justin   |      1 |            1 |
|      17 |   2 | 11/01/2012 |        7 | justin  | alan     |      1 |            1 |
|      18 |   2 | 11/01/2012 |        8 | alan    | dan      |      1 |            1 |
|      19 |   2 | 11/01/2012 |        9 | dan     | greg     |      1 |            1 |
+---------+-----+------------+----------+---------+----------+--------+--------------+

我现在已经有了相当多的数据,为了我自己的目的,我开始对它进行一些查询(我还没有告诉团队的其他成员......不会'喜欢影响结果)。我已经完成了一些没有问题,但我一直试图获得某种结果。

我正在寻找的是每个人成为最后一名接球员的次数。现在,正如你在桌子上看到的那样,由于缺席等原因,每天投掷的数量并不总是恒定的,所以我不能简单地通过thrownum选择接收器。

对于上述数据,它将返回:

+--------+-------------------+
| person | LastReceiverTotal |
+--------+-------------------+
| dan    |                 1 |
| greg   |                 1 |
+--------+-------------------+

我到目前为止:

SELECT MAX(thrownum) AS LastThrowNum, day FROM Throws GROUP BY day

现在,这会返回一些有用的数据。我每天都得到最高的喧嚣。看起来我需要做的就是让接收器获得这个值,然后得到一个由接收器分组的计数来得到我的答案。但是,这不起作用,因为结果集不是由于使用聚合函数的上述查询而看起来的结果。

我怀疑有一种更好的方法来设计表来存储数据,说实话,但同样我也确定有一种方法可以将这些信息与表格一起获取 - 某种内部查询?我无法弄清楚它是如何工作的。任何人都可以了解如何做到这一点吗?

1 个答案:

答案 0 :(得分:2)

您拥有的查询为您提供了每天最大的投掷。

有了这个,你只需要与你的桌子进行内部联接并获得接收器及其发生的次数。

select t.receiver as person, count(t.day) as LastReceiverTotal from Throws t
inner join (SELECT MAX(thrownum) AS LastThrowNum, day FROM Throws GROUP BY day) a on a.LastThrowNum = t.thrownum and a.day = t.day
group by t.receiver