2015-02-02 2 views
1

Я не совсем уверен, как я могу собрать один запрос SQLite для достижения следующего. Я могу заставить кусочки работать, но, похоже, не может объединить все это в один.SQLite SELECT запрос через несколько столбцов с повторяющимися сгруппированными строками

У меня есть таблица, которая выглядит следующим образом (реальный набор данных несколько Гб):

| 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 | 

Эти данные генерируются вложенной сделай петлей для некоторого моделирования я делал.

Из этой таблицы мне по существу нужно извлечь таблицу, которая выглядит следующим образом, чтобы я мог нанести цвет/тепловую карту.

| 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 | 

Так что это позволит мне сделать цветовую палитру, основанную на значениях ColumnD с использованием 2D-массив (диагональ должен быть установлен равным нулю, так как значения Columna и ColumnB никогда не равны для данной строки, поэтому данные по диагонали нет в базе данных):

| 21 | 34 | 46 
------------------ 
21 | 0 | | 
------------------ 
34 | | 0 | 
------------------ 
46 | | | 0 

Мой вопрос заключается в основном, как я могу настроить один запрос агрегировать все данные, которые идут в 2D массив для создания палитры.

Важно отметить, что ColumnA и ColumnB в основном заполнены одним и тем же набором целых чисел. Я могу получить уникальный список целочисленных значений, используя DISTINCT. Я нашел несколько потоков SO о выборе DISTINCT для нескольких столбцов, однако ни один из примеров не показывает, как использовать агрегатор для выбора значений в других столбцах. В этом случае я хочу использовать min() для выбора самого низкого значения в ColumnD для каждой пары идентификаторов в ColumnA и ColumnB. Выбор DISTINCT в одном столбце не работает, потому что это координатная пара (ColumnA, ColumnB), которая отличается.

Любая помощь была бы принята с благодарностью!

+0

Непонятно, как вы переходите от исходной таблицы к извлеченной таблице. Оба выглядят точно так же. Каковы ваши критерии? –

+0

Извините, возможно, что потерялся в тексте. Критерии выбирают для каждой пары (ColumnA, ColumnB), минимальное значение для ColumnD. – kartikkumar

ответ

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.

+0

Отлично! Я видел функцию «group by». Кажется, работает по своему усмотрению.'ColumnD' не следует дублировать, так как я храню его до точности с плавающей точкой, и маловероятно, что два моделирования приведут к точному одинаковому значению. В случае случайности, что есть столкновение, будет 'мин' выдавать ошибку? – kartikkumar

+0

@kartikkumar. , , Не за что. Вы получите все строки с минимальным значением в выходе. –

+0

Отлично! Это работает, я думаю, я мог бы использовать DISTINCT, чтобы обеспечить выбор только одной строки. – kartikkumar

0

Вы должны быть в состоянии использовать предложения GROUP BY для группировки полей, которые вы хотите, чтобы сопоставить строки для и выполнения агрегированных вычислений на:

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

Это не работает для последнего примера в желаемых результатах. –

+0

Это правда. Извиняюсь, я не стал подробно останавливаться на желаемых результатах. –

Смежные вопросы