LINUX.ORG.RU

Помогите с запросом PostgreSQL DISTINCT ON аля MySQL GROUP BY with skip NULL value

 , ,


0

1

Чёт я туплю, нужен help =)

Есть таблица с полем для группировки. Нужно вывести все записи сгруппированные по этому полю (g), вот только не нужно группировать если оно NULL.

Ниже приведён пример для MySQL (всё хорошо).
Но, какой аналог в PostgreSQL?

Таблица:

+----+------+
| id | g    |
+----+------+
|  1 | NULL |
|  2 |    2 |
|  3 |    2 |
|  4 |    1 |
|  5 |    1 |
|  6 |    1 |
|  7 | NULL |
|  8 | NULL |
+----+------+

MySQL Query:

SELECT *
FROM `test`
GROUP BY `g`, IF(`g` IS NULL, `id`, 0);

MySQL Result:

+----+------+
| id | g    |
+----+------+
|  1 | NULL |
|  7 | NULL |
|  8 | NULL |
|  4 |    1 |
|  2 |    2 |
+----+------+

==========

PostgreSQL?

SELECT DISTINCT ON (g) g, id
FROM test;

Вот только как не группировать, когда g=NULL?

WHERE g IS DISTINCT FROM ...

★★★

группировка всю жизнь работала с агрегатными функциями, а здесь что за бред?

anonymous ()
Ответ на: комментарий от anonymous

согласен, аналог запроса (MySQL) в студию бы не помешал.

qbbr ★★★ ()
Ответ на: комментарий от anonymous

Вот плюсую этого товарища, не понимаю что там группируется в примере с mysql. Почему например у тебя id= 4 для g=1 откуда эта цифра взялась?

pi11 ★★★★★ ()
Ответ на: комментарий от qbbr

А что делает этот запрос если на словах? Куда делась например строка с id=6?

pi11 ★★★★★ ()
Ответ на: комментарий от qbbr

ты от меня хочешь запрос? тогда сначала поставь корректно задачу (лучше в терминах бизнес-логики); а объяснять тебе что такое группировка в сиквеле, и как она работает, здесь никто не будет — это азбука, и она есть в любой книге

anonymous ()
Ответ на: комментарий от qbbr

Ну вот этот запрос получит твой результат на твоих данных -

select min(id), g from test where g is not null group by id union all select id, g from test where g is null

только сомневаюсь, что это то, что тебе нужно =)

pi11 ★★★★★ ()
Ответ на: комментарий от pi11

Есть 100 товаров в таблице. Есть поле g - по которому я хочу сгруппировать некие товары.

Пример:

90 товаров, где поле g = NULL;
10 товаров, где поле g = например число 2 (одинаковое);

Нудно вывести 91 товар, из который 90 шт будет с g=NULL и (любой) 1 из 10ти, у которого одинаковое значение в колонке g

qbbr ★★★ ()
Ответ на: комментарий от qbbr

ну тогда тебе мой запрос подойдет, который я выше привел.

pi11 ★★★★★ ()
Ответ на: комментарий от pi11

это такая специальная олимпиада? где даны таблица, ее содержание и результат некоторого запроса, а задача — составить этот запрос :)

anonymous ()
Ответ на: комментарий от pi11

столбец «test.g» должен фигурировать в предложении GROUP BY или использоваться в агрегатной функции

qbbr ★★★ ()
Ответ на: комментарий от qbbr

Опечатался, вот -

select min(id), g from test where g is not null group by g union all select id, g from test where g is null

pi11 ★★★★★ ()
Ответ на: комментарий от pi11

мамкины дизигнеры — они такие! :)

anonymous ()
Ответ на: комментарий от qbbr

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

pi11 ★★★★★ ()
Ответ на: комментарий от qbbr

select min(id), (case when g is null then 10000+id else g end) as gn from test group by gn

для g равных = null, будут выводится числа = 10000+id

id же у тебя уник?

pi11 ★★★★★ ()
Ответ на: комментарий от pi11

да, уникально.

Спс за помощь, рабочий вариант.

qbbr ★★★ ()
Ответ на: комментарий от pi11

Можно извратиться, но тогда вместо NULL что-то подставлять нужно,

А зачем извращаться, и не подставить просто Id, если он уникален (аналогично запросу из MySQL)?

SELECT g, MIN(id) AS id
  FROM test
 GROUP BY g, CASE WHEN g IS NULL THEN id END
loruser ()
Ответ на: комментарий от loruser

Ну я это делал, чтобы эти записи можно было отличить от тех у которых g!=null.

pi11 ★★★★★ ()
Ответ на: комментарий от anonymous

группировка всю жизнь работала с агрегатными функциями, а здесь что за бред?

Это багофича MySQL'а. Он допускает не-аггрегаты при запросе с группировкой. При это считается, что все значения в не «аггрегированной» колонке в рамках группы и можно выбирать любое (на практике выбирается первое).

Sectoid ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.