如何正确分组SQL结果集?

时间:2010-06-09 19:12:06

标签: sql android sqlite

SQL noob,请耐心等待我!

我在数据库中存储了一个3元组(x,y,{signal1,signal2,..})。 我有一个包含表坐标(x,y)的数据库和另一个名为signals(signal,coordinate_id,group)的表,它存储各个信号值。在同一坐标上可以有几个信号。

该组只是一个abitrary整数,它将信号表中的条目标记为属于同一组(假设它们属于同一个坐标)。因此,具有相同“coordinate_id”和“group”的任何信号一起形成如上所示的元组。

例如,

Coordinates table                 Signals table
--------------------             -----------------------------     
| id  |  x  |  y  |              | id | signal | coordinate_id | group | 
|  1  |  1  |  2  |              | 1  |   45   |       1       |   1   |
|  2  |  2  |  5  |              | 2  |   95   |       1       |   1   |
                                 | 3  |   33   |       1       |   1   |
                                 | 4  |   65   |       1       |   2   |
                                 | 5  |   57   |       1       |   2   |
                                 | 6  |   63   |       2       |   1   |

这会产生元组(1,2 {45,95,33}),(1,2,{65,57}),(2,5,{63})等等。

我想为每个坐标检索{signal1,signal2,...}的集合。属于一组的信号具有相同的coordinate_id和组,但我不一定知道组值。我只知道如果特定coordinate_id的组值相同,那么具有该组的所有人都会形成一组。

我尝试了查看SQL GROUP BY,但我意识到它是用于聚合函数的。

有人可以指出如何在SQL中正确执行此操作,或提供改进数据库结构的提示。

2 个答案:

答案 0 :(得分:2)

SQLite支持类似于MySQL的GROUP_CONCAT()聚合函数。它在组中汇总一组值并将它们连接在一起以逗号分隔。

SELECT c.x, c.y, GROUP_CONCAT(s.signal) AS signal_list
FROM Signals s
JOIN Coordinates ON s.coordinate_id = c.id
GROUP BY s.coordinate_id, s.group

SQLite还允许select-list中的列与group-by子句中的列不匹配,即使ANSI SQL和大多数实现都不严格允许这样做。

答案 1 :(得分:1)

我个人将数据库写成3个表:

x_y(x, y, id)  coords_groups(pos, group, id)  signals(group, signal)  
with signals.group->coords_groups.id and coords_groups.pos->x_y.id

因为你试图表示一种4维数组。

然后,从几个坐标(X,Y)得到一个信号列表的ArrayList你可以用这个

SELECT temp."group", signals.signal 
FROM (
    SELECT cg."group", cg.id
    FROM x_y JOIN coords_groups AS cg ON x_y.id = cg.pos
    WHERE x_y.x=X AND x_y.y=Y ) 
AS temp JOIN signals ON temp.id=signals."group"
ORDER BY temp."group" ASC

(X Y在最里面)

在这种伪代码中:

getSignalsGroups(X, Y)
    ArrayList<List<Signals>> a
    List<Signals> temp
    query=sqlLiteExecute(THE_SQL_SNIPPET, x, y)

    row=query.fetch()        //fetch the first row to set the groupCounter
    actualGroup=row.group
    temp.add(row.signal)

    for(row : query)         //foreach row add the signal to the list
        if(row.group!=actualGroup)     //or reset the list if is a new group
            a.add(actualGroup, temp)
            actualGroup=row.group; temp= new List
        temp.add(row.signal)
    return a