sql - 如何在 PostgreSQL 中获得第二行?

标签 sql postgresql

我有下一张 table :

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_valuenth_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() 函数来完成..

最佳答案

此查询使用类似于子查询的 WITH 结构。在生产中使用之前使用 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;

关于sql - 如何在 PostgreSQL 中获得第二行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30841423/

相关文章:

sql - 如何保证统计表的连续性?

sql - 删除外部表会清除从外部表填充的全局临时表

postgresql - 在azure容器实例上部署Postgres数据库?

java - jooq 无法从 a 类转换为 b 类

php - 对于每个/查询没有给出正确的值

mysql - SQL查询多个表抛出语法错误?

sql - MS SQL Server 数据透视表,列子句中带有子查询

sql - Postgres 查询在 "Where"处返回 SQL 错误语法错误

php - 带有字符串插值的准备语句因语法错误而失败

postgresql - 使用 LIMIT 子句与简单地获取 N 个结果有何不同?