该列在选择列表中无效,因为该列既未包含在聚合函数中,也未包含在GROUP BY子句中

时间:2018-09-12 12:00:55

标签: sql

我有一张桌子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    |
+------------+------------+------------+

5 个答案:

答案 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