我有一张桌子user_purchases
+------------+------------+------------+
| user_login | date | product |
+------------+------------+------------+
| neo | 31.03.2999 | hat |
+------------+------------+------------+
| trinity | 31.03.1999 | sunglasses |
+------------+------------+------------+
| neo | 01.04.2999 | sunglasses |
+------------+------------+------------+
| trinity | 01.04.1999 | hat |
+------------+------------+------------+
您必须获取用户的最新购买信息。
SELECT
user_purchases.user_login AS user_login,
max(user_purchases.date) AS date
FROM user_purchases
GROUP BY user_purchases.user_login;
如何获得产品?
+------------+------------+------------+
| neo | 01.04.2999 | sunglasses |
+------------+------------+------------+
| trinity | 01.04.1999 | hat |
+------------+------------+------------+
答案 0 :(得分:2)
一种方法使用相关子查询进行过滤:
select up.*
from user_purchases up
where up.date = (select max(up2.date)
from user_purchases up2
where up2.user_login = up.user_login
);
答案 1 :(得分:0)
select *
from user_purchases
where date = (select max(date)
from user_purchases)
答案 2 :(得分:0)
尝试一下
SELECT *
FROM user_purchases
WHERE date = MAX(STR_TO_DATE(date, '%m-%d-%Y'));
答案 3 :(得分:0)
您可以使用公用表表达式。
;WITH Foo
AS
(
SELECT
up.user_login AS user_login,
max(up.date) AS date
FROM
dbo.user_purchases up
GROUP BY
up.user_login
)
SELECT
Foo.*,
up.product
FROM
Foo
JOIN
user_purchases up
ON
up.user_login = Foo.user_login AND
up.date = Foo.date
答案 4 :(得分:0)
另一个选择(如果您的RDBMS支持的话)是使用DENSE_RANK
(或RANK
)窗口功能:
WITH
-- sample data
user_purchases(user_login, [date], product) AS
(
SELECT 'neo', '1999-03-31', 'hat'
UNION ALL SELECT 'trinity', '1999-03-31', 'sunglasses'
UNION ALL SELECT 'neo', '1999-04-01', 'sunglasses'
UNION ALL SELECT 'trinity', '1999-04-01', 'hat'
)
-- CTE for ranked data
,ranked_purchases AS
(
SELECT *,
DENSE_RANK() OVER (PARTITION BY user_login ORDER BY [date] DESC) AS rnk
FROM user_purchases
)
-- actual query
SELECT * FROM ranked_purchases
WHERE rnk = 1