Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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
Sql 每个客户的第二个最小值_Sql_Date_Mysql 5.7 - Fatal编程技术网

Sql 每个客户的第二个最小值

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

我正在使用MySQL数据库。因此,我正在处理两个列:CustomerId和OrderDate。我想为每个客户找到第二个订单日期第二个最小订单日期。

如果您使用的是MySQL 8+,则可以在此处使用行号:

以cte为例 选择*,按CustomerId按ORDER按OrderDate rn划分的行数 从你的桌子上 选择CustomerId、OrderDate 来自cte 其中rn=2; 我建议使用dense_rank,因为即使存在如下重复订单日期,它也可以为您提供正确的结果:

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,它不支持窗口功能。请检查更新的答案!!