如何获取PostgreSQL中的第二行?
我有下一张桌子:如何获取PostgreSQL中的第二行?,sql,postgresql,Sql,Postgresql,我有下一张桌子: COLUMN_NAME DATA_TYPE PK NULLABLE inc_id bigint YES NO dt_cr timestamp NO NO email varchar(255) NO YES email列不是唯一的,所以我应该使用GROUP BY email 问题: 如何从此表中获取最小日期、最小日期后的下一行以及与此日期相关的电子邮件 我读过关于first\u value和
COLUMN_NAME DATA_TYPE PK NULLABLE
inc_id bigint YES NO
dt_cr timestamp NO NO
email varchar(255) NO YES
email
列不是唯一的,所以我应该使用GROUP BY email
问题:
如何从此表中获取最小日期、最小日期后的下一行以及与此日期相关的电子邮件
我读过关于first\u value
和nth\u value
函数的内容,下面列出了代码,但它似乎工作不正常
SELECT J1.email, J2.first_date, J2.second_date
FROM (
SELECT email
FROM orders
GROUP BY email) J1
LEFT OUTER JOIN (
SELECT email,
first_value(dt_cr) over (order by dt_cr ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) first_date,
NTH_VALUE(dt_cr, 2) over (order by dt_cr ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) second_date
FROM orders) J2
ON (J1.email=J2.email);
有什么想法吗
--编辑
也许可以使用
rank()
函数来完成。尝试使用行数
函数
在整个表中:
select *
from(select *, row_number() over(order by dt_cr) rn from tableName)t
where rn <= 2
此查询使用与子查询类似的构造。在生产中使用之前,请使用
EXPLAIN
对该查询进行调查,因为它在大型表上可能运行缓慢:
WITH orders AS (
SELECT
email
, first_value(dt_cr) OVER wnd1 AS min_date
, nth_value(dt_cr, 2) OVER wnd1 AS second_date
FROM orders
WINDOW wnd1 AS ( PARTITION BY email ORDER BY email, dt_cr)
)
SELECT DISTINCT *
FROM orders
WHERE second_date IS NOT NULL;
事实上,我尝试了一种不同的方法
SELECT DISTINCT ON (email) o1.email, o1.dt_cr AS first_date, o2.dt_cr AS seconf_date
FROM orders o1
INNER JOIN orders o2 ON o1.email = o2.email AND o1.inc_id != o2.inc_id
ORDER BY o1.email, o1.dt_cr ASC
不确定这是否是您所需要的,一个示例数据将非常有用。无论如何,我已经为我的结果创建了一个语法错误。当我执行您的查询时,我得到:
无效操作:语法错误位于或接近“wnd1”代码>我正在aws红移中执行所有查询,而这个查询在这里不起作用。。它还需要框架clauseAmazon Redshift是基于PostgreSQL 8.0.2的。您可能需要将SELECT
子句中的窗口定义:first_value(dt_cr)移到(按电子邮件顺序划分,dt_cr行前面无边界)。这里有一个描述和示例:是的,我会修复它,现在所有的工作。谢谢!
SELECT DISTINCT ON (email) o1.email, o1.dt_cr AS first_date, o2.dt_cr AS seconf_date
FROM orders o1
INNER JOIN orders o2 ON o1.email = o2.email AND o1.inc_id != o2.inc_id
ORDER BY o1.email, o1.dt_cr ASC