首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL lead()发布camelCase列

PostgreSQL lead()发布camelCase列
EN

Stack Overflow用户
提问于 2016-05-19 00:44:27
回答 2查看 1.5K关注 0票数 1

所以我试图查询一个时间卡表,它的结构如下

代码语言:javascript
复制
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

我要做的是选择两个值之间的所有行,但也选择该雇员在该组行之后的下一行,而不管值是多少。

这是我的查询

代码语言:javascript
复制
select "clockInTime", "clockOutTime", lead("clockInTime",1)
from "timeCard"
where "clockInTime" between 1462797450 and 1462883850
and "employeeId" = 555

但我知道这个错误:

错误:函数引导(bigint,整型)不存在

但是,当我从lead()中删除双引号时,我只得到了这个结果,因为我的列名是camelCase:

错误:列"clockintime“不存在

我使用的是node.js和节点-pg客户端。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-19 01:29:00

您没有“从lead()中删除双引号”。该错误消息显示您实际上从"clockInTime"中删除了双引号。

错误:列"clockintime“不存在

考虑:

它的长短:如果可以避免,请不要在Postgres中使用caMelCase标识符:

至于你所描述的任务:

选择两个值之间的所有行,但也选择该雇员在该组行之后的下一行。

OVER子句在窗口函数lead()中缺失,就像@Gordon指出的那样。但是,即使语法错误得到了修复,lead() (或任何其他窗口函数)似乎也不是获得所需内容的正确方法。它向结果中的每一行添加一列,而要向集合中添加一行。

我建议UNION ALLORDER BY / LIMIT 1在结果集中添加"next“行:

代码语言:javascript
复制
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中添加更多表达式,以便在发生关联时获得确定的结果。

LIMITORDER BY添加到UNION查询的单个分支需要括号。示例:

如果您也希望对前面的行进行排序:

代码语言:javascript
复制
(
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
);
票数 2
EN

Stack Overflow用户

发布于 2016-05-19 00:50:55

您需要over子句。我不知道你到底在寻找什么逻辑,但有点像:

代码语言:javascript
复制
select "clockInTime", "clockOutTime",
       lead("clockInTime", 1) over (order by clickInTime)
from "timeCard"
where "clockInTime" between 1462797450 and 1462883850 and "employeeId" = 555;

通常情况下,每个员工都希望这样做:

代码语言:javascript
复制
select "clockInTime", "clockOutTime",
        lead("clockInTime", 1) over (partition by "employeeid" order by clickInTime)
from "timeCard"
where "clockInTime" between 1462797450 and 1462883850 and "employeeId" = 555;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37312208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档