mysql 错误代码:3588,具有RANGE框架的窗口“”具有日期时间类型的ORDER BY表达式,只允许INTERVAL界限值

xienkqul  于 2023-03-11  发布在  Mysql
关注(0)|答案(1)|浏览(483)

我需要为表sales.mytable中的数据查找连续3天订购且每个订单金额大于50美元的客户。这是我在MySQL工作台中为此编写的SQL查询。

SELECT T.Customer_ID, T.Customer_Name, T.Order_Date
 FROM (SELECT T.*, COUNT(*) OVER(ORDER BY Order_Date RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING) cnt_days
          FROM sales.mytable T
         WHERE Sales>'50')T
 WHERE cnt_days = 3;

我的示例表如下所示。

# Row_ID, Order_ID, Order_Date, Ship_Date, Ship_Mode, Customer_ID, Customer_Name, Segment, Country, City, State, Postal_Code, Region, Product_ID, Category, Sub_Category, Product_Name, Sales
'1', 'CA-2017-152156', '2017-11-08', '2017-11-11', 'Second Class', 'CG-12520', 'Claire Gute', 'Consumer', 'United States', 'Henderson', 'Kentucky', '42420.0', 'South', 'FUR-BO-10001798', 'Furniture', 'Bookcases', 'Bush Somerset Collection Bookcase', '261.9600'

我收到此错误。错误代码:3588.带有RANGE框架的窗口“”有日期时间类型的ORDER BY表达式。只允许INTERVAL边界值。
我确信OVER(ORDER BY ORDER_DATE RANGE BEETWEEN 1 PRECEDING AND 1 Following)是一个原因,但找不到任何问题。我写这个查询时可能犯了什么错误。
我的表结构为

rhfm7lfc

rhfm7lfc1#

ORDER BY表达式的数据类型为DATE。您指定了RANGEshift -即按值移位。因此,移位的数据类型必须与DATE兼容。

... 
COUNT(*) OVER ( ORDER BY Order_Date 
                RANGE BETWEEN INTERVAL 1 DAY PRECEDING 
                          AND INTERVAL 1 DAY FOLLOWING ) cnt_days
...

但如果BETWEEN 1 PRECEDING AND 1 FOLLOWING表示行数,则必须使用ROWSshift,而不是RANGE。

...
COUNT(*) OVER ( ORDER BY Order_Date 
                ROWS BETWEEN 1 PRECEDING 
                         AND 1 FOLLOWING ) cnt_days
...

相关问题