将不在聚合函数中的列保留在分组语句中[重复]
Posted
技术标签:
【中文标题】将不在聚合函数中的列保留在分组语句中[重复]【英文标题】:Keep Column which is not in aggregate function in group by statement [duplicate] 【发布时间】:2019-03-08 08:51:59 【问题描述】:我想修改现有的选择,使其输出每个客户的 MAX(amount) 行及其所有值。 目前的结果是这样的。
AMOUNT CUSTOMERID ITEMID USERNAME USERID SUMMARYDAY
60 198507 205 luk 12 03.10.18
300 198526 207 max 12 03.10.18
20000 198507 126 luk 12 03.10.18
6000 198526 158 max 12 03.10.18
1200 198526 206 max 12 03.10.18
但我想要这个:
AMOUNT CUSTOMERID ITEMID USERNAME USERID SUMMARYDAY
20000 198507 126 luk 12 03.10.18
6000 198526 158 max 12 03.10.18
此刻的查询:
SELECT max(totalamount) as amount, cg.customerId, g.itemid,
(select c.nickname from customer c where c.customerId=cg.customerid) as nickname,
12 as clientId, sysdate as summaryDate
FROM ItemBuy cg,
ItemToSell gf,
Item g
WHERE cg.itemSellId = gf.itemSellId and gf.itemId = g.itemId
and cg.type = 0 and cg.shopId = 12
and cg.starttime >= sysdate-100 and cg.starttime < sysdate+100
group by cg.customerId
having max(totalamount) > 0
我将查询匿名了一点,但我的主要问题是:
如何使用 group by 语句保留特定的列,并告诉 sql 在 group by 和 max() “选择”一行之后保留它。
非常感谢您!
【问题讨论】:
所以您希望每个用户只有一行?哪一个? (不相关)今日提示:切换到现代、明确的JOIN
语法。更容易编写(没有错误),更容易阅读(和维护),并且在需要时更容易转换为外连接。
您的查询和当前/预期的输出不匹配。这可能会使某人难以帮助您。请清理您的问题。
@jarlh 是的,我想要每个用户一行,它应该是每个用户数量最多的行
使用解析函数;使用MAX(..) OVER(..)
解析函数(即SELECT * FROM ( SELECT ..., MAX( totalamount) OVER ( PARTITION BY customerid ) AS mx FROM ... ) WHERE totalamount = mx
)或RANK() OVER ( ... ORDER BY ... )
解析函数(即SELECT * FROM ( SELECT ..., RANK() OVER ( PARTITION BY customerid ORDER BY totalamount DESC ) AS rnk FROM ... ) WHERE rnk = 1
)
【参考方案1】:
我建议采用这种直截了当的方式,并将您的描述“以每个客户的 MAX(amount) 及其所有值输出行”转换为 SQL:
select * from a_table t
where (t.customerid,t.amount) in (
select customerid,max(amount) from a_table group by customerid);
如果您需要更多意见,请告诉我。
【讨论】:
以上是关于将不在聚合函数中的列保留在分组语句中[重复]的主要内容,如果未能解决你的问题,请参考以下文章