Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取PostgreSQL中的第二行?_Sql_Postgresql - Fatal编程技术网

如何获取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