Sql 保留GROUPBY语句中不在聚合函数中的列

Sql 保留GROUPBY语句中不在聚合函数中的列,sql,oracle,group-by,aggregate-functions,greatest-n-per-group,Sql,Oracle,Group By,Aggregate Functions,Greatest N Per Group,我想修改一个现有的select,以便它输出包含每个客户最大金额及其所有值的行。 目前的结果是这样的 AMOUNT CUSTOMERID ITEMID USERNAME USERID SUMMARYDAY 60 198507 205 luk 12 03.10.18 300 198526 207 max

我想修改一个现有的select,以便它输出包含每个客户最大金额及其所有值的行。 目前的结果是这样的

   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
我对这个问题略加匿名,但我的主要问题是:

如何在GROUPBY语句中保留特定列,并在GROUPBY和max选择了一行后告诉sql仅保留该列


提前非常感谢

我建议采用这种直截了当的方法,并将您的描述输出包含每个客户最大金额的行及其所有值转换为SQL:


如果您需要更多输入,请告诉我。

那么您希望每个用户只需要一行吗?哪一个?今天不相关的提示:切换到现代的显式连接语法。更易于编写而无错误,更易于读取和维护,并且在需要时更易于转换为外部联接。您的查询和当前/预期输出不匹配。这可能会使别人很难帮助你。请澄清您的问题。@jarlh是的,我希望每个用户有一行,它应该是每个用户使用分析函数数量最高的一行;使用分析功能,即选择*从选择…,customerid分区上的最大总金额为mx从。。。其中totalamount=mx或分析函数,即SELECT*FROM SELECT…,按customerid顺序按totalamount DESC作为rnk FROM…对分区进行排序。。。其中rnk=1
select * from a_table t
where (t.customerid,t.amount) in (
   select customerid,max(amount) from a_table group by customerid);