Как выбрать отчет о работе по заказу в postgresql? - PullRequest
0 голосов
/ 23 декабря 2018

Таблица:

| ID |  SITE| TIME  | TYPE|
|----|------|-------|-----|
| aa | 100  | 12-18 | fo  |
| aa | 101  | 12-10 | ba  |
| bb | 102  | 12-10 | fo  |
| cc | 100  | 12-09 | ba  |
| cc | 109  | 12-01 | fo  |
| dd | 100  | 12-08 | fo  |

Значение fo равно 2, а ba равно 1.
Я хочу заказать по типу и вставить его в другую таблицу.

INSERT INTO "NUtable"
SELECT DISTINCT ON("ID")
*
FROM
TABLEX
ORDER BY
"ID","SITE","TIME",(CASE "TYPE" WHEN 'fo' then 2
WHEN 'ba' then 1
ELSE NULL END
) DESC

Кажется, SQL работает нормально.Однако в некоторых строках результат получился неправильным.Почему так?

Вот пример для cc, который получил неправильный результат: http://sqlfiddle.com/#!17/0c0e4/2

Результат должен быть

+----+------+-------+------+
| ID | SITE | TIME  | TYPE |
+----+------+-------+------+
| aa |  100 | 12-18 | fo   |
| bb |  102 | 12-10 | fo   |
| cc |  109 | 12-01 | fo   |
| dd |  100 | 12-08 | fo   |
+----+------+-------+------+

вместо

+----+------+-------+------+
| ID | SITE | TIME  | TYPE |
+----+------+-------+------+
| aa |  100 | 12-18 | fo   |
| bb |  102 | 12-10 | fo   |
| cc |  100 | 12-09 | ba   |
| dd |  100 | 12-08 | fo   |
+----+------+-------+------+

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Вам нужно заказать по типу, как ключ second :

SELECT DISTINCT ON ("ID") x.*
FROM TABLEX x
ORDER BY "ID",
         (CASE "TYPE" WHEN 'fo' THEN 2 WHEN 'ba' then 1
               ELSE NULL
          END) DESC,
         "SITE", "TIME";

DISTINCT ON берет первую строку, которую встречает для каждого "ID".Вы хотите, чтобы эта строка имела определенный тип, поэтому логика для этого типа должна быть частью ORDER BY.

0 голосов
/ 23 декабря 2018

Сортировка строк имеет приоритет в порядке столбцов, заданных после ORDER BY, поэтому в вашем примере она работает как ожидалось, так как вы заказываете id, site, ...

Если вы хотитедля достижения ожидаемого результата вам нужно переместить тип в секунду в следующем порядке:

ORDER BY id, (CASE “TYPE”...

Вы также должны переключиться в кейсе так, чтобы 'fo' было 1, а 'ba' было 2

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