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
)
我知道这个问题已经以类似的方式提出,但我在 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
)