В Sqlite 3 я пытаюсь выяснить, как выбирать строки на основе минимального значения. Я думаю, что я ограничен тем, что не знаю достаточно терминологии для эффективного поиска в Google.
Стол выглядит так:
num text num2
---------- ---------- ----------
0 a 1
0 a 2
1 a 3
1 b 4
Я хочу получить строки, где num2
есть 1, 2
, и 4
. Я хочу сделать выбор на основе минимального значения num для каждого уникального значения текстового столбца.
Итак, для text = 'a'
, минимальное значение num
равно 0
, поэтому я хочу строки 1 и 2. Для text = 'b'
, минимальное значение num
равно 1
, поэтому я хочу строки 4
.
Используя различные комбинации группы по, я могу получить или строки 1
и 2
или строку 1
и 4
. Я чувствую, что мне не хватает компонента SQL, который будет делать то, что я хочу, но я не смог понять, что это может быть.
Как правильно сделать этот тип запроса?
Возможное решение
Я нашел в способ сделать это. Я не достаточно авторитетный, чтобы ответить на свой вопрос, поэтому я делаю обновление здесь. Я не уверен, всегда ли это правильно или какова эффективность. Любые комментарии приветствуются.
Я использовал составной оператор выбора, где один запрос находит минимальное значение num для каждого уникального значения текста:
sqlite> select num, text from t group by text having num = min( num );
num text
---------- ----------
0 a
1 b
Затем я соединил это с полной таблицей, чтобы получить все строки, соответствующие этим двум столбцам.
sqlite> with u as
( select num, text from t group by text having num = min( num ) )
select t.* from t join u on t.num = u.num and t.text = u.text;
num text num2
---------- ---------- ----------
0 a 1
0 a 2
1 b 4
u
запроса сохраняется во временной таблице независимо от того, записан ли он как CTE, представление или встроенный как подзапрос.Я склонен делать такие вещи с внешним самовключением:
Это в основном говорит; дай мне все записи, которые не имеют более высокого значения, то есть ноль.
источник
Так как же найти ответ на свой вопрос в следующий раз? На мой взгляд, это путем разложения и следования логике. И вы поняли это правильно:
Это переводится как:
(Это должно быть эквивалентно вашему
having
запросу. Может быть интересно взглянуть на строки, гдеnum
равные NULL. Точнее: посмотрите, что имеют строки с нулевыми эффектами, которые вы могли бы сначала отфильтровать с помощью awhere num is not null
)Отсюда вы можете достичь желаемого результата:
Или используя соединение:
А когда производительности недостаточно для ваших таблиц, начните смотреть на более сложные операторы.
источник
Не должен ли этот запрос быть именно тем, что вам нужно?
источник
num2
значения уникальны.