我有下一张 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_value
和 nth_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/