Как правильно сгруппировать набор результатов SQL? - PullRequest
2 голосов
/ 09 июня 2010

SQL noob, пожалуйста, потерпите меня !!

Я храню 3 кортежа в базе данных (x, y, {signal1, signal2, ..}).
У меня есть база данных с таблицами координат (x, y) и другой таблицей сигналов (signal, координата_ид, группа), в которой хранятся значения отдельных сигналов. В одной и той же координате может быть несколько сигналов.

Группа - это просто случайное целое число, которое помечает записи в таблице сигналов как принадлежащие к одному и тому же набору (при условии, что они принадлежат к одной и той же координате). Таким образом, любые сигналы с одинаковыми координатами и группой образуют кортеж, как показано выше.

Например,

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, ...} для каждой координаты. Сигналы, принадлежащие к набору, имеют одинаковые координаты и группу , но я не обязательно знаю значение группы . Я только знаю, что если значение группы одинаково для определенного координаты_идентификатора, то все те, у кого эта группа, образуют один набор.

Я попытался изучить SQL GROUP BY, но понял, что он предназначен для использования с агрегатными функциями.

Может ли кто-нибудь указать, как это правильно сделать в SQL, или дать советы по улучшению структуры моей базы данных.

Ответы [ 2 ]

2 голосов
/ 09 июня 2010

SQLite поддерживает агрегатную функцию GROUP_CONCAT(), аналогичную MySQL. Он сворачивает набор значений в группу и объединяет их вместе через запятую.

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 также допускает несоответствие между столбцами в списке выбора и столбцами в предложении group-by, хотя это строго не разрешено ANSI SQL и большинством реализаций.

1 голос
/ 10 июня 2010

лично я написал бы базу данных в виде 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

(где XY находится внутри)

внутри псевдокода такого типа:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...