跨多个列的SQLite SELECT查询,具有重复的分组行

时间:2015-02-02 14:31:06

标签: python sql arrays sqlite

我不完全确定如何将单个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)。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

对我来说,对于ColumnDColumnA对,您似乎想要ColumnB的最小值。如果您不关心idColumnC,那么简单的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;

这假设ColumnDColumnA中的值永远不会重复ColumnB

答案 1 :(得分:0)

您应该能够使用GROUP BY子句对要为其整理行的字段进行分组,并对其执行聚合计算:

SELECT ColumnA, ColumnB, Min(ColumnC), Min(ColumnD)
FROM Table1
GROUP BY ColumnA, ColumnB