Как выбрать строку минимального значения в Group By sql - PullRequest
2 голосов
/ 09 мая 2019

Вот очень похожая база данных sqlite, с которой я работаю -

CREATE TABLE sampleData(
   pincode INTEGER NOT NULL,
   place_id INTEGER NOT NULL,
   price INTEGER NOT NULL,
   name TEXT NOT NULL,
   UNIQUE(pincode, place_id)
);

Я искал названия мест в каждом пин-коде (только 1 место в пин-коде), у которого там самая низкая цена. Самый простой запрос, который я мог придумать -

SELECT * FROM sampleData 
WHERE price > 0
GROUP BY pincode
ORDER BY PRICE

, который, кажется, работает в sqlite (?), Но не работает в pg9.6 и дает неправильный результат в Mysql. Вот еще один, который, кажется, дает тот же результат -

SELECT * FROM sampleData 
WHERE price > 0
GROUP BY pincode
HAVING MIN(PRICE)

, результаты которого аналогичны последним. Мне было интересно, что не так с этими запросами, и я хотел бы получить помощь в разработке правильного.

SQLFIDDLE

Ответы [ 3 ]

4 голосов
/ 09 мая 2019

Ваш первый запрос - искаженный SQL. SELECT * не имеет смысла с GROUP BY. Случилось так, что SQLite расширяет язык SQL, чтобы делать то, что вы хотите. Я считаю, что это плохо.

В любом случае вы можете сделать:

SELECT sd.*
FROM sampleData sd
WHERE sd.price = (SELECT MIN(sd2.price)
                  FROM sampleData sd2
                  WHERE sd2.price > 0 AND
                        sd2.pincode = sd.pincode
                 );

Это может вернуть дубликаты строк, если несколько мест имеют одинаковую цену. Предполагая, что place_id уникален, вы можете изменить это на:

SELECT sd.*
FROM sampleData sd
WHERE sd.place_id = (SELECT sd2.place_id
                     FROM sampleData sd2
                     WHERE sd2.price > 0 AND
                           sd2.pincode = sd.pincode
                     ORDER BY sd2.price ASC
                     LIMIT 1
                    );
0 голосов
/ 09 мая 2019

Вам нужен запрос, чтобы получить минимум price для каждого pincode и затем присоединить его к таблице:

select s.* 
from sampledata s inner join (
  select pincode, min(price) price
  from sampledata
  group by pincode
) g on g.pincode = s.pincode and g.price = s.price  

См. Демонстрационную версию .Результаты:

| pincode | place_id | price | name   |
| ------- | -------- | ----- | ------ |
| 123     | 2        | 13    | Place2 |
| 222     | 18       | 21    | Place5 |
| 456     | 5        | 200   | Place3 |
0 голосов
/ 09 мая 2019

Попробуйте это ...

SELECT pincode,place,name,MIN(PRICE)
FROM sampleData 
WHERE price > 0
GROUP BY pincode,place,name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...