Проблема с выводом () PostgreSQL со столбцом camelCase

Итак, я пытаюсь запросить таблицу карточек времени, структура которой подобна этой

employeeId | clockInTime| clockOutTime
-----------+------------+--------------
   555     | 1462797450 | 1462785465 
   555     | 1462883850 | 1462871850 
   111     | 1463056650 | 1463044650 <== skip this
   555     | 1463143050 | 1463131050 <== get this
   555     | 1463229426 | 1463245655 <== but not this

Я пытаюсь выбрать все строки между двумя значениями, а также следующую строку после этой группы строк для этого сотрудника независимо от значения

это мой запрос

select "clockInTime", "clockOutTime", lead("clockInTime",1)
from "timeCard"
where "clockInTime" between 1462797450 and 1462883850
and "employeeId" = 555

но я получаю эту ошибку:

ошибка: функция lead(bigint, integer) не существует

Но когда я удаляю двойные кавычки из lead(), я получаю только это, потому что имена моих столбцов - camelCase:

ошибка: столбец "clockintime" не существует

Я использую node.js и клиент node-pg.


person Darkrum    schedule 19.05.2016    source источник


Ответы (2)


Вы не "удалили двойные кавычки из lead()". Сообщение об ошибке показывает, что вы действительно удалили двойные кавычки из "clockInTime":

error: column "clockintime" does not exist

Рассмотреть возможность:

Длинный и короткий: не используйте идентификаторы caMelCase с Postgres, если вы можете этого избежать:


Что касается задачи, которую вы описываете:

выберите все строки между двумя значениями, а также следующую строку после этой группы строк для этого сотрудника

Предложение OVER отсутствовало в оконной функции lead(), например < указал href="https://stackoverflow.com/a/37312245/939860">@Gordon. Но даже с исправленной синтаксической ошибкой lead() (или любая другая оконная функция) не кажется правильным подходом для получения того, что вы просите. Он добавляет столбец к каждой строке результата, в то время как вы хотите добавить строку в набор.

Я предлагаю UNION ALL и ORDER BY / LIMIT 1 добавить "следующую" строку в результирующий набор:

SELECT *
FROM   "timeCard"
WHERE  "employeeId" = 555
AND    "clockInTime" BETWEEN 1462797450 AND 1462883850

UNION ALL
(  -- parentheses required
SELECT *
FROM   "timeCard"
WHERE  "employeeId" = 555
AND    "clockInTime" > 1462883850
ORDER  BY "clockInTime"
LIMIT  1
);

Многоколоночный индекс на ("employeeId", "clockInTime") сделает это очень быстро даже для больших таблиц.

Если "clockInTime" не определено как уникальное, вы можете добавить дополнительные выражения в ORDER BY, чтобы получить детерминированный результат в случае равенства.

Скобки необходимы для добавления LIMIT или ORDER BY к отдельной части запроса UNION. Пример:

Если вы хотите, чтобы ведущие строки также отсортировались:

(
SELECT *
FROM   "timeCard"
WHERE  "employeeId" = 555
AND    "clockInTime" BETWEEN 1462797450 AND 1462883850
ORDER  BY "clockInTime"
)
UNION ALL
(
SELECT *
FROM   "timeCard"
WHERE  "employeeId" = 555
AND    "clockInTime" > 1462883850
ORDER  BY "clockInTime"
LIMIT  1
);
person Erwin Brandstetter    schedule 19.05.2016
comment
Я вижу, спасибо, и причина, по которой я использую camelCase, заключается в том, что я хочу, чтобы все было согласовано на сервере и во внешнем интерфейсе. - person Darkrum; 19.05.2016
comment
@Darkrum: обратите внимание на скобки, которые я добавил. - person Erwin Brandstetter; 19.05.2016

Вам нужен пункт over. Я не уверен, какую именно логику вы ищете, но что-то вроде:

select "clockInTime", "clockOutTime",
       lead("clockInTime", 1) over (order by clickInTime)
from "timeCard"
where "clockInTime" between 1462797450 and 1462883850 and "employeeId" = 555;

Как правило, вам нужно это для каждого сотрудника:

select "clockInTime", "clockOutTime",
        lead("clockInTime", 1) over (partition by "employeeid" order by clickInTime)
from "timeCard"
where "clockInTime" between 1462797450 and 1462883850 and "employeeId" = 555;
person Gordon Linoff    schedule 19.05.2016
comment
нет, я получил это, когда делал эту ошибку: синтаксическая ошибка на или почти закончилась - person Darkrum; 19.05.2016
comment
и не является ли это необязательным? - person Darkrum; 19.05.2016
comment
Нет, потому что свинец - это оконная функция. - person Jose Hermosilla Rodrigo; 19.05.2016
comment
@ Даркрам . . . Вы уверены, что используете Postgres? - person Gordon Linoff; 19.05.2016
comment
да, хотя это старая версия 8.0.2, потому что мы разрабатываем против красного смещения aws. - person Darkrum; 19.05.2016
comment
@ Даркрам . . . Redshit поддерживает lead(): docs.aws.amazon.com/redshift/latest/ dg/r_WF_LEAD.html. - person Gordon Linoff; 19.05.2016