row_number () всегда возвращает 1, так как исходная таблица имеет только одну строку - PullRequest
0 голосов
/ 20 февраля 2020

Давайте рассмотрим этот минимальный пример:

SELECT row_number() over() as GID, 
       unnest(myarray)     as letter
FROM 
(
    SELECT string_to_array('a,b,b', ',') as myarray
) AS T

Теперь, поскольку таблица T содержит только один элемент, функция row_number() всегда возвращает 1, даже если возвращаются 3 строки.

Итак, я получаю:

GID   letter
1     "a"
1     "b"
1     "b"

Вместо

GID   letter
1     "a"
2     "b"
3     "b"

Как это можно исправить?

Ответы [ 2 ]

2 голосов
/ 20 февраля 2020

Поместите предложение unnest прямо вокруг вызова string_to_array, чтобы в T уже было несколько строк:

SELECT row_number() over() as GID, myarray as letter
FROM (
    SELECT unnest(string_to_array('a,b,c', ',')) as myarray
) AS T

Также я бы рекомендовал использовать WITH ORDINALITY вместо row_number() для получения индексированных элементов массива:

SELECT gid, letter
FROM UNNEST(string_to_array('a,b,c', ',')) WITH ORDINALITY AS T(gid, letter)

Это также работает, если вы хотите сохранить возвращающее массив выражение выбора

SELECT gid, letter
FROM UNNEST(
  (SELECT string_to_array('a,b,c', ',') as myarray)
) WITH ORDINALITY AS T(letter, gid)

или использовать боковой запрос:

SELECT gid, letter
FROM
  (SELECT string_to_array('a,b,c', ',') as myarray) AS T,
  UNNEST(T.myarray) WITH ORDINALITY AS U(letter, gid)
1 голос
/ 20 февраля 2020

Следуя примеру перед редактированием, попробуйте следующий запрос:

SELECT 
 row_number() OVER () AS gid, ST_AsText(geom)
FROM (SELECT 
        st_makepixel(
          ST_GeomFromText('POLYGON((2580000 1182000,2581000 1182000,2581000 1183000,2580000 1183000,2580000 1182000))',2056),200.0,50) AS geom) j

 gid |                                         st_astext                                          
-----+--------------------------------------------------------------------------------------------
   1 | POLYGON((2580000 1182000,2580200 1182000,2580200 1182200,2580000 1182200,2580000 1182000))
   2 | POLYGON((2580200 1182000,2580400 1182000,2580400 1182200,2580200 1182200,2580200 1182000))
   3 | POLYGON((2580400 1182000,2580600 1182000,2580600 1182200,2580400 1182200,2580400 1182000))
   4 | POLYGON((2580600 1182000,2580800 1182000,2580800 1182200,2580600 1182200,2580600 1182000))
   5 | POLYGON((2580800 1182000,2581000 1182000,2581000 1182200,2580800 1182200,2580800 1182000))
   6 | POLYGON((2580000 1182200,2580200 1182200,2580200 1182400,2580000 1182400,2580000 1182200))
   7 | POLYGON((2580200 1182200,2580400 1182200,2580400 1182400,2580200 1182400,2580200 1182200))
   8 | POLYGON((2580400 1182200,2580600 1182200,2580600 1182400,2580400 1182400,2580400 1182200))
   9 | POLYGON((2580600 1182200,2580800 1182200,2580800 1182400,2580600 1182400,2580600 1182200))
  10 | POLYGON((2580800 1182200,2581000 1182200,2581000 1182400,2580800 1182400,2580800 1182200))
  11 | POLYGON((2580000 1182400,2580200 1182400,2580200 1182600,2580000 1182600,2580000 1182400))
  12 | POLYGON((2580200 1182400,2580400 1182400,2580400 1182600,2580200 1182600,2580200 1182400))
  13 | POLYGON((2580400 1182400,2580600 1182400,2580600 1182600,2580400 1182600,2580400 1182400))
  14 | POLYGON((2580600 1182400,2580800 1182400,2580800 1182600,2580600 1182600,2580600 1182400))
  15 | POLYGON((2580800 1182400,2581000 1182400,2581000 1182600,2580800 1182600,2580800 1182400))
  16 | POLYGON((2580000 1182600,2580200 1182600,2580200 1182800,2580000 1182800,2580000 1182600))
  17 | POLYGON((2580200 1182600,2580400 1182600,2580400 1182800,2580200 1182800,2580200 1182600))
  18 | POLYGON((2580400 1182600,2580600 1182600,2580600 1182800,2580400 1182800,2580400 1182600))
  19 | POLYGON((2580600 1182600,2580800 1182600,2580800 1182800,2580600 1182800,2580600 1182600))
  20 | POLYGON((2580800 1182600,2581000 1182600,2581000 1182800,2580800 1182800,2580800 1182600))
  21 | POLYGON((2580000 1182800,2580200 1182800,2580200 1183000,2580000 1183000,2580000 1182800))
  22 | POLYGON((2580200 1182800,2580400 1182800,2580400 1183000,2580200 1183000,2580200 1182800))
  23 | POLYGON((2580400 1182800,2580600 1182800,2580600 1183000,2580400 1183000,2580400 1182800))
  24 | POLYGON((2580600 1182800,2580800 1182800,2580800 1183000,2580600 1183000,2580600 1182800))
  25 | POLYGON((2580800 1182800,2581000 1182800,2581000 1183000,2580800 1183000,2580800 1182800))
(25 Zeilen)
...