我不完全确定如何将单个SQLite查询组合在一起以实现以下目标。我可以得到点点滴滴,但似乎无法将它们融合为一个。
我有一个看起来像这样的表(实际数据集是几GB):
| ID | ColumnA | ColumnB | ColumnC | ColumnD |
| 1 | 21 | 34 | 10 | 0.12654 |
| 2 | 21 | 34 | 20 | 0.25478 |
| 3 | 21 | 46 | 10 | 0.43564 |
| 4 | 21 | 46 | 20 | 1.02487 |
| 5 | 34 | 21 | 10 | 0.01476 |
| 6 | 34 | 21 | 20 | 0.87265 |
| 7 | 34 | 46 | 10 | 0.46478 |
| 8 | 34 | 46 | 20 | 0.13665 |
| 9 | 46 | 21 | 10 | 0.04189 |
| 10 | 46 | 21 | 20 | 0.91754 |
| 11 | 46 | 34 | 10 | 0.73688 |
| 12 | 46 | 34 | 20 | 0.24299 |
这个数据是由嵌套的do-loop生成的,用于我正在进行的一些模拟。
从这张表中,我基本上需要提取一个如下所示的表格,以便我可以绘制颜色/热图。
| ID | ColumnA | ColumnB | ColumnC | ColumnD |
| 1 | 21 | 34 | 10 | 0.12654 |
| 3 | 21 | 46 | 10 | 0.43564 |
| 5 | 34 | 21 | 10 | 0.01476 |
| 8 | 34 | 46 | 20 | 0.13665 |
| 9 | 46 | 21 | 10 | 0.04189 |
| 12 | 46 | 34 | 20 | 0.24299 |
因此,这将使我能够使用2D数组基于ColumnD值制作颜色图(对角线应设置为零,因为ColumnA和ColumnB的值对于给定的行永远不相等;因此对角线的数据在数据库中不存在):
| 21 | 34 | 46
------------------
21 | 0 | |
------------------
34 | | 0 |
------------------
46 | | | 0
我的问题基本上是如何设置单个查询来聚合进入2D数组的所有数据以生成色彩映射。
重要的是要注意ColumnA和ColumnB基本上由同一组整数填充。我可以使用DISTINCT获取唯一的整数值列表。我发现了一些关于跨多个列选择DISTINCT的SO线程,但是没有一个示例显示如何使用聚合器来选择其他列中的值。在这种情况下,我想使用min()在ColumnA中为ColumnA和ColumnB中的每对id选择最低值。在单个列上选择DISTINCT不起作用,因为它是不同的坐标对(ColumnA,ColumnB)。
非常感谢任何帮助!
答案 0 :(得分:1)
对我来说,对于ColumnD
和ColumnA
对,您似乎想要ColumnB
的最小值。如果您不关心id
或ColumnC
,那么简单的group by
就足够了:
select ColumnA, ColumnB, min(ColumnD)
from table t
group by ColumnA, ColumnB;
如果您确实需要该行中的所有值,则可以join
返回以获取它们:
select t.*
from table t join
(select ColumnA, ColumnB, min(ColumnD) as ColumnD
from table t
group by ColumnA, ColumnB
) tt
on t.ColumnA = tt.ColumnA and t.ColumnB = tt.ColumnB and
t.ColumnD = tt.ColumnD;
这假设ColumnD
和ColumnA
中的值永远不会重复ColumnB
。
答案 1 :(得分:0)
您应该能够使用GROUP BY子句对要为其整理行的字段进行分组,并对其执行聚合计算:
SELECT ColumnA, ColumnB, Min(ColumnC), Min(ColumnD)
FROM Table1
GROUP BY ColumnA, ColumnB