PostgreSQL если запрос? - PullRequest
       22

PostgreSQL если запрос?

2 голосов
/ 27 апреля 2010

Есть ли способ выбрать записи на основе оператора if?

Мой стол выглядит так:

id | num | dis 
1  | 4   | 0.5234333
2  | 4   | 8.2234
3  | 8   | 2.3325
4  | 8   | 1.4553
5  | 4   | 3.43324

И я хочу выбрать num и dis, где dis - это наименьшее число ... Итак, запрос, который даст следующие результаты:

id | num | dis 
1  | 4   | 0.5234333
4  | 8   | 1.4553

Ответы [ 3 ]

4 голосов
/ 27 апреля 2010

Если вы хотите, чтобы все строки с минимальным значением в группе:

SELECT id, num, dis
FROM table1 T1
WHERE dis = (SELECT MIN(dis) FROM table1 T2 WHERE T1.num = T2.num)

Или вы можете использовать соединение, чтобы получить тот же результат:

SELECT T1.id, T1.num, T1.dis
FROM table1 T1
JOIN (
    SELECT num, MIN(dis) AS dis
    FROM table1
    GROUP BY num
) T2
ON T1.num = T2.num AND T1.dis = T2.dis

Если вам нужна только одна строка из каждой группы, даже если есть связи, вы можете использовать это:

SELECT id, dis, num FROM (
    SELECT id, dis, num, ROW_NUMBER() OVER (PARTITION BY num ORDER BY dis) rn
    FROM table1
) T1
WHERE rn = 1

К сожалению, это будет не очень эффективно. Если вам нужно что-то более эффективное, см. Страницу Quassnoi на , в которой выбираются строки с групповым максимумом для PostgreSQL . Здесь он предлагает несколько способов выполнения этого запроса и объясняет производительность каждого из них. Резюме из статьи выглядит следующим образом:

В отличие от MySQL, PostgreSQL реализует несколько чистых и документированных способов выберите записи, ведущие по группам максимумы, включая оконные функции и различаются.

Однако из-за отсутствия свободного индекса поддержка сканирования PostgreSQL оптимизатор и менее эффективное использование индексов в PostgreSQL, запросы использование этих функций занимает слишком много времени.

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

Это решение использует рекурсивные CTE для эмулировать свободное сканирование индекса и очень эффективен, если столбцы группировки имеют низкая мощность.

1 голос
/ 27 апреля 2010

Используйте это:

SELECT DISTINCT ON (num) id, num, dis
FROM tbl
ORDER BY num, dis

Или, если вы собираетесь использовать другие СУБД в будущем, используйте это:

select * from tbl a where dis =
(select min(dis) from tbl b where b.num = a.num)
0 голосов
/ 27 апреля 2010

Если вам нужна логика IF, вы можете использовать PL / pgSQL.

http://www.postgresql.org/docs/8.4/interactive/plpgsql-control-structures.html

Но попробуйте сначала решить проблему с SQL, если это возможно, это будет быстрее и используйте PL / pgSQL, когда SQL не может решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...