У меня есть запрос 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