MySQL 在 Where 子句中使用别名在 Group By 查询中选择了错误的列值

MySQL Selecting wrong column value in Group By query with alias in where clause

我知道这个问题已经以类似的方式提出,但我在 where 子句中找不到任何带有别名的问题。

我有这样的 table 结构:

CREATE TABLE Orders
( ID int NOT NULL Primary Key
, OrderNr VARCHAR(6) NOT NULL
, Date DATE NOT NULL
, Time CHAR(6) NOT NULL
, GeoCode CHAR(6) NULL) ;

我的插入内容如下所示:

INSERT INTO orders (ID, OrderNr, Date, Time, GeoCode) VALUES (1, '123456', '2022-02- 
15', '111110', '4022')
, (2, '123457', '2022-02-15', '121210', '4022')
, (3, '123455', '2021-04-15', '171515', '4020')
, (4, '123455', '2021-04-16', '150302', '4022')
, (5, '123466', '2022-03-03', '191810', '4020')
, (6, '123466', '2022-03-04', '121410', '4022')

现在我正在尝试获取所有 OrderNr 的最新日期和时间值,如下所示:

SELECT ID, OrderNr, MAX(cast(concat(Date, ' ', cast(Time as Time)) as datetime)) as 
DateAndTime, GeoCode
FROM Orders o1
GROUP BY OrderNr

结果显示正确的最新日期和时间,但 GeoCode 错误。例如对于 OrderNr 123455 是4020但应该是4022.

我知道已经有人问过类似的问题,但我不能在 where 子句中使用别名。有人可以向我解释我做错了什么吗? 非常感谢您。

如果你的 mysql 版本支持 ROW_NUMBER window 功能你可以试试这个

SELECT *
FROM (

    SELECT ID, 
          OrderNr, 
          cast(concat(Date, ' ', cast(Time as Time)) as datetime) DateAndTime, 
          GeoCode,
          ROW_NUMBER() OVER(PARTITION BY OrderNr ORDER BY cast(concat(Date, ' ', cast(Time as Time)) as datetime) DESC) rn
    FROM Orders o1
) t1
WHERE rn = 1

或使用带有 EXISTS

的子查询
SELECT *
FROM Orders o1
WHERE EXISTS (
    SELECT 1
    FROM Orders oo
    WHERE oo.OrderNr = o1.OrderNr
    HAVING MAX(oo.Date) = o1.Date
)

sqlfiddle