Sql 每个客户的第二个最小值
我正在使用MySQL数据库。因此,我正在处理两个列:CustomerId和OrderDate。我想为每个客户找到第二个订单日期第二个最小订单日期。如果您使用的是MySQL 8+,则可以在此处使用行号: 以cte为例 选择*,按CustomerId按ORDER按OrderDate rn划分的行数 从你的桌子上 选择CustomerId、OrderDate 来自cte 其中rn=2; 我建议使用dense_rank,因为即使存在如下重复订单日期,它也可以为您提供正确的结果:Sql 每个客户的第二个最小值,sql,date,mysql-5.7,Sql,Date,Mysql 5.7,我正在使用MySQL数据库。因此,我正在处理两个列:CustomerId和OrderDate。我想为每个客户找到第二个订单日期第二个最小订单日期。如果您使用的是MySQL 8+,则可以在此处使用行号: 以cte为例 选择*,按CustomerId按ORDER按OrderDate rn划分的行数 从你的桌子上 选择CustomerId、OrderDate 来自cte 其中rn=2; 我建议使用dense_rank,因为即使存在如下重复订单日期,它也可以为您提供正确的结果: SELECT * FRO
SELECT * FROM
(SELECT t.*, DENSE_RANK() OVER (PARTITION BY CustomerId ORDER BY OrderDate) dr
FROM yourTable t
) t where dr = 2;
SELECT T.*
FROM YOURTABLE T
WHERE 1 = (
SELECT COUNT(DISTINCT ORDER_DATE)
FROM YOURTABLE TT
WHERE TT.ORDER_DATE > T.ORDER_DATE
)
如果您的MySQL版本不支持以下分析功能,您可以使用如下corelated子查询:
SELECT * FROM
(SELECT t.*, DENSE_RANK() OVER (PARTITION BY CustomerId ORDER BY OrderDate) dr
FROM yourTable t
) t where dr = 2;
SELECT T.*
FROM YOURTABLE T
WHERE 1 = (
SELECT COUNT(DISTINCT ORDER_DATE)
FROM YOURTABLE TT
WHERE TT.ORDER_DATE > T.ORDER_DATE
)
我将使用如下子查询:
select o.*
from orders o
where o.order_date = (select o2.order_date
from orders o2
where o2.customer_id = o.customer_id
order by o2.order_date
limit 1 offset 1
);
子查询是返回第二个日期的相关子查询。如果希望第二个日期包含其他列,可以将其移动到“选择”
有了关于客户id、订单日期的索引,这可能是最快的解决方案
这假设每个日期有一行,或者如果有多行,第二行可以是最早的日期。如果您想要第二个不同的日期,那么在子查询中使用select distinct-但是select distinct和group by会产生额外的开销。非常感谢您的响应,问题是我使用的MySQL版本中的窗口函数不起作用。有没有其他方法可以做到这一点?你能为每位客户提供重复的日期吗?是的,可以。非常感谢您的回复。有没有不使用窗口函数的方法可以做到这一点?我使用的是MySQL 5.7,它不支持窗口功能。请检查更新的答案!!