【问题标题】:Query to calculate the count of numbers that occur in the previous rows查询以计算前几行中出现的数字的计数
【发布时间】:2019-07-08 20:36:06
【问题描述】:

我有一个这样的表格视图:

Id, Picks
5, 1
5, 5
5, 10
5, 20

4, 8
4, 10
4, 11
4, 22

3, 1
3, 8
3, 10
3, 25

2, 3
2, 5
2, 23
2, 24

1, 14
1, 17
1, 20
1, 24

有两列 Id 和 Picks。每次抽奖的 id 重复四次,其中有 4 个 1-25 之间的数字。

我想显示前 3 次抽奖中出现的每个抽奖号码的计数。因此,对于 id=5 的抽奖号码,如果这些号码在 id 为 4,3 和 2 的抽奖中出现一次,则将其计算在内。

所以对于上面的例子,计数是这样的:

Id, Count
5,  3
4,  2
etc.

如何通过 mysql 查询得到这个结果?表格视图没有唯一的 ID。

【问题讨论】:

  • 我只有这些列,我在表格视图中将四列合二为一,我认为这会更简单,在这种情况下我不得不牺牲唯一 ID。所以在实际表中,我有一个唯一的 id,每个数字有 4 列。
  • ID 53 是如何获得的?
  • 自己加入表,ON t1.id < t2.id 以获取 ID 号较低的行。
  • 5,4是id。 3 和 2 是前 3 次抽奖中出现的数字的计数。
  • 其实应该是ON t1.id BETWEEN t2.id-3 and t2.id-1 AND t1.pick = t2.pick。然后只计算行数。

标签: mysql sql


【解决方案1】:

我猜你需要类似的东西:

select
  a.id, count(distinct b.picks)
from my_table a
join my_table b on b.picks = a.picks
               and b.id between a.id - 3 and a.id - 1
group by a.id

【讨论】:

  • 谢谢,你能解释一下为什么 a.id - 3 和 a.id - 1 吗?为什么不 a.id - 4 和 a.id - 1 ?
  • 我认为你需要 count(distinct b.picks)。
  • 谢谢@forpas,我才注意到你的意思。答案需要更新。
  • @Max 已修复。它是 (-3, -1) 因为你想要“前 3 次平局”;即 -3、-2 和 -1。
【解决方案2】:

存在:

select 
  t.id,
  sum(
    case when exists (
        select 1 from tablename 
        where (id between t.id - 3 and t.id - 1) and picks = t.picks
      ) then 1
      else 0
    end
  ) counter
from tablename t 
group by t.id
order by t.id desc

请参阅demo
结果:

| id  | counter |
| --- | ------- |
| 5   | 3       |
| 4   | 2       |
| 3   | 0       |
| 2   | 1       |
| 1   | 0       |

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多