所以我试图查询一个时间卡表,它的结构如下
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但我知道这个错误:
错误:函数引导(bigint,整型)不存在
但是,当我从lead()中删除双引号时,我只得到了这个结果,因为我的列名是camelCase:
错误:列"clockintime“不存在
我使用的是node.js和节点-pg客户端。
发布于 2016-05-19 01:29:00
您没有“从lead()中删除双引号”。该错误消息显示您实际上从"clockInTime"中删除了双引号。
错误:列"clockintime“不存在
考虑:
它的长短:如果可以避免,请不要在Postgres中使用caMelCase标识符:
至于你所描述的任务:
选择两个值之间的所有行,但也选择该雇员在该组行之后的下一行。
OVER子句在窗口函数lead()中缺失,就像@Gordon指出的那样。但是,即使语法错误得到了修复,lead() (或任何其他窗口函数)似乎也不是获得所需内容的正确方法。它向结果中的每一行添加一列,而要向集合中添加一行。
我建议UNION ALL和ORDER BY / LIMIT 1在结果集中添加"next“行:
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
);发布于 2016-05-19 00:50:55
您需要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;https://stackoverflow.com/questions/37312208
复制相似问题