【发布时间】:2021-10-10 07:16:21
【问题描述】:
考虑以下示例表
| x_id | name_id1 | name_id2 |
|---|---|---|
| x1 | John | Frank |
| x2 | Frank | John |
| x3 | Jack | John |
| x4 | John | Jack |
| x5 | Bob | Frank |
| x6 | George | Bob |
| x7 | Bob | Finn |
| x8 | Mark | James |
| x9 | James | Finn |
目标是提取以下结果
| name | frequency |
|---|---|
| John | 4 |
| Bob | 3 |
| James | 2 |
从概念上讲,这是以下过程的结果:
- 计算所有名字出现的频率并选择出现频率最高的名字,即 John,出现 4 次(行
x1到x4)。 - 现在删除所有包含 John 的行,这会留下从
x5到x9的行。再次确定出现频率最高的名称。这给了你 Bob,它出现了 3 次(行x5到x7)。 - 现在也删除行
x5到x7,这样我们就剩下行x8到x9。再次确定出现频率最高的名称。这给了我们詹姆斯,它出现了 2 次。 - 现在也将行
x8删除到x9,这让我们一无所有,所以我们完成了。
此数据存储在 SQLite 中的联结表中,如下所示(在实际情况下,每个 x_id 可以有两个以上的名称)
| id | x_id | name_id |
|---|---|---|
| 1 | x1 | John |
| 2 | x1 | Frank |
| 3 | x2 | John |
| 4 | x2 | Frank |
| 5 | x3 | John |
| 6 | x3 | Jack |
| 7 | x4 | John |
| 8 | x4 | Jack |
| 9 | x5 | Bob |
| 10 | x5 | Frank |
| 11 | x6 | Bob |
| 12 | x6 | George |
| 13 | x7 | Bob |
| 14 | x7 | Finn |
| 13 | x8 | James |
| 14 | x8 | Mark |
| 13 | x9 | James |
| 14 | x9 | Finn |
我们需要什么样的过程来检索描述的结果?考虑到上面的联结表是可变长度的(只是为了确保我们没有拿出固定数量的@987654337 @s 作为有效答案)。
我确实考虑过使用WITH RECURSIVE 方法,但是这不允许我们这样做
- 在递归选择中执行聚合函数
COUNT,这在我们想要计算出现次数时似乎是必需的。 - 删除所有以前的
x_ids,只删除当前在队列中的那些。
【问题讨论】:
-
频率关系如何?
-
抱歉,我不确定您在寻找什么?
-
如果有 4 个 Johns 和 4 个 Bobs 怎么办?应该先选哪个?
-
好问题,在这种情况下我们可以按字母顺序选择,实际上两者之间没有偏好。
-
@forpas 值得一提的是:如果这会使查询更容易/可行,那么返回所有频率相同的项目也是可以接受的。
标签: sqlite recursion recursive-query