ВЫБЕРИТЕ DISTINCT, пропуская столбцы в ORDER BY - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть запрос SELECT DISTINCT..., который выдает следующий вывод:

       id       |      name      |     _pref_     | _num_ 
----------------+----------------+----------------+-------
 Cf-1           | Cf-1           | Cf-            |     1
 Cf-2           | Cf-2           | Cf-            |     2
 Cf-3           | Cf-3           | Cf-            |     3
 Cf-5           | Cf-5           | Cf-            |     5
 Me-1           | Me-1           | Me-            |     1
 Me-2           | Me-2           | Me-            |     2
 Me-3           | Me-3           | Me-            |     3
 Me-4           | Me-4           | Me-            |     4
 Me-5           | Me-5           | Me-            |     5
 Me-6           | Me-6           | Me-            |     6
 Me-7           | Me-7           | Me-            |     7
 Me-8           | Me-8           | Me-            |     8
 Me-9           | Me-9           | Me-            |     9
 Me-10          | Me-10          | Me-            |    10
 Me-11          | Me-11          | Me-            |    11
 Me-12          | Me-12          | Me-            |    12
 Me-13          | Me-13          | Me-            |    13
 Me-14          | Me-14          | Me-            |    14
 Me-15          | Me-15          | Me-            |    15
 Me-16          | Me-16          | Me-            |    16
 Me-18          | Me-18          | Me-            |    18
 Me-20          | Me-20          | Me-            |    20
 Me-22          | Me-22          | Me-            |    22
 Me-24          | Me-24          | Me-            |    24
 RC-1           | RC-1           | RC-            |     1
 RC-2           | RC-2           | RC-            |     2
 RM             | RM             | RM             |      
 Ronda Hospital | Ronda Hospital | Ronda Hospital |      
(28 rows)

_pref_ и _num_ - это просто вычисления над name столбец, позволяющий упорядочивать строки более интуитивно с точки зрения пользователя.

Но они не добавляют никакой дополнительной информации , поэтому я бы удалил их из вывода.

Проблема в том, что когда я пытаюсь это сделать, я получаю следующую ошибку:

joanmi@alpha:~/.../SQL/gis$ node layer.carreteres_menorca.sql.js list | pg geogps
ERROR:  para SELECT DISTINCT, las expresiones en ORDER BY deben aparecer en la lista de resultados
LINE 43:         order by _pref_, _num_, nom

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

Я уверен, что должен быть какой-то способ сказать Postgres, что эти столбцы зависят от других, поэтому их можно исключить из вывода, даже используя Предложение DISTINCT.

Запрос, выдающий прежний вывод, выглядит так:

WITH layer as (
    select
        computed.name as id
        , computed.name || '-' || id as part_id
        , computed.name as name
        , label
        , name as codiTram
        , ST_AsEWKT(geom) as geom
        , regexp_replace(
            name
            , '^([^0-9]+).*$'
            , '\1'
            , 'i'
        ) as _pref_
        , nullif(
            regexp_replace(
                name
                , '^[^0-9]*([0-9]+)?.*$'
                , '\1'
                , 'i'
            )
        , '')::integer as _num_
    from "Carreteres_Menorca"
    , lateral (
        select regexp_replace(
            name
            , '^.*?Me[-.]*([0-9]+).*$'
            , 'Me-\1'
            , 'i'
        ) as name
    ) as computed
    where name is not null
)
select distinct
    id, name, _pref_, _num_
from layer
order by _pref_, _num_, name

1 Ответ

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

Вы должны получить желаемые результаты, если вы group by id, name:

select id, name
from layer
group by id, name
order by max(_pref_), max(_num_), name
...