我可以生成一个地图,显示特定行在 SQLite 中的特定组中吗?

Can I generate a map that shows a particular row was in a particular group in SQLite?

假设我有以下数据:

+--------+-------+
| Group  | Data  |
+--------+-------+
| 1      | row 1 |
| 1      | row 2 |
| 1      | row 3 |
| 20     | row 1 |
| 20     | row 3 |
| 10     | row 1 |
| 10     | row A |
| 10     | row 2 |
| 10     | row 3 |
+--------+-------+

是否可以绘制一张地图,显示哪些组有哪些行?组可能不会传染,因此可以将它们放在单独的 table 中,并使用行索引代替字符串索引。像这样:

+-------+
| Group |
+-------+
| 1     |
| 20    |
| 10    |
+-------+

+-------+----------------+
| Data  | Found in group |
+-------+----------------+
| row 1 | 111            |
| row A |   1            |
| row 2 | 1 1            |
| row 3 | 111            |
+-------+----------------+

其中第一个字符代表第1组,第2个字符代表第20组,第3个字符代表第10组。

组行的顺序并不重要,只要我可以参考哪一行与哪个字符对应即可。

我问这个是因为我看到了这个 crazy example in the documentation generating a fractal,但我不太明白。

这可行吗?

SELECT Data, group_concat("Group") AS "Found in group"
FROM yourtable
GROUP BY Data

将为您提供 CSV 组列表。

要找到缺失值,首先要准备一个包含所有可能组合的数据集。您可以使用 CROSS JOIN.

来实现

获得该数据集后,将其与实际数据集进行比较。

考虑到 Order by 是在 Grp 列中完成的,您可以使用下面的方法实现它。

SELECT
a.Data,group_concat(case when base.Grp is null then "." else "1" end,'') as Found_In_Group
,group_concat(b.Grp) as Group_Order
FROM
(SELECT Data FROM yourtable Group By Data)a
CROSS JOIN
(SELECT Grp FROM yourtable Group By Grp Order by Grp)b
LEFT JOIN yourtable base
ON  b.Grp=base.Grp
AND a.Data=base.Data
GROUP BY a.Data

注意:考虑 . 而不是空白,以便更好地显示缺失组。

Data Found_In_Group Group_Order
row 1 111 1,10,20
row 2 11. 1,10,20
row 3 111 1,10,20
row A .1. 1,10,20

演示:Try here