Как использовать новый созданный столбец, где столбец в sql? - PullRequest
0 голосов
/ 17 марта 2020

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

                SELECT device_id, tag_id, at, _deleted, data, 
                row_number() OVER (PARTITION BY device_id ORDER BY at DESC) AS row_num
                FROM mdb_history.devices_tags_mapping_history
                WHERE at <= '2019-04-01' 
                AND _deleted = False
                AND (tag_id = '275674' or tag_id = '275673')
                AND row_num = 1

Однако, когда я запускаю следующий запрос, я получаю следующую ошибку:

ERROR:  column "row_num" does not exist

Есть ли способ на go об этом. Один из способов, которым я пытался, было использовать его следующим образом:

SELECT * from (SELECT device_id, tag_id, at, _deleted, data, 
                        row_number() OVER (PARTITION BY device_id ORDER BY at DESC) AS row_num
                        FROM mdb_history.devices_tags_mapping_history  
                        WHERE at <= '2019-04-01' 
                        AND _deleted = False
                        AND (tag_id = '275674' or tag_id = '275673')) tag_deleted 
                WHERE tag_deleted.row_num = 1

Но это становится слишком сложным, поскольку я делаю это с другими запросами, так как у меня есть номер соединения, и мне нужно выбрать столбец, как указано от так это вызывает много выбора оператора. Любой умный способ сделать это более простым способом. Спасибо

Ответы [ 2 ]

1 голос
/ 17 марта 2020

Вы не можете ссылаться на псевдоним row_num, который вы определили на том же уровне выбора в вашем запросе. Итак, ваш основной вариант здесь - это подзапрос, где будет доступно row_num. Но Postgres на самом деле имеет возможность получить то, что вы хотите по-другому. Вы можете использовать DISTINCT ON здесь:

SELECT DISTINCT ON (device_id), device_id, tag_id, at, _deleted, data
FROM mdb_history.devices_tags_mapping_history
WHERE
    at <= '2019-04-01' AND
    _deleted = false AND
    tag_id IN ('275674', '275673')
ORDER BY
    device_id,
    at DESC;
0 голосов
/ 17 марта 2020

Слишком длинный / отформатированный для комментария. У оператора @TimBiegeleisen есть причина «псевдоним, который вы определили на том же уровне выбора». Причина в том, что все операторы SQL следуют той же последовательности для оценки . К сожалению, эта последовательность НЕ соответствует последовательности пунктов в представлении оператора. эта последовательность в порядке:

  1. из
  2. , где
  3. сгруппировать по
  4. , имеющему
  5. выбрать
  6. ограничения

Вы заметите, что то, что на самом деле выбрано, падает очень хорошо после оценки предложения where. Так как ваш псевдоним определен на этапе выбора, он не существует на этапе где.

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