我正在使用IBM的DB2;但我希望这可以使用SQL标准完成,而不使用每个数据库制造商添加的附加功能。
我的问题:
对于每个CID(客户ID),我需要找到购买次数最多的CLUB。
在下表中,客户#1(' cid = 1')从俱乐部购买了大部分图书'读者摘要'。我可以使用Find most frequent value in SQL column
完成此部分然而CID = 2对我来说要困难得多,而且我被卡住了。对于' cid = 2'我们可以看到“俱乐部”中最常出现的刺痛。专栏是奥普拉'之间的纽带。和' YRB Gold' - 但是当我们看到QNTY'专栏(对人们来说)显而易见的是,#cid = 2'是'YRB_gold'。 ' YRB_GOLD'卖了5本书,其中' OPRAH'只卖了4本书。
我把'cid = 3'在这里:
有47位客户(cid)。我的问题是:如何逐步完成每个CID',并考虑“CLUB'”下最常出现的字符串,同时还要跟踪' CLUB' QNTY'每个俱乐部?如果您选择提供帮助,请提供最中性的OEM答案吗?提前谢谢。
******************************编辑#1 ************** ***************************
感谢下面的答案。目前我遇到了一个让它发挥作用的问题。
表名是' yrb_purchase'。
当我输入所有内容时:
SELECT cid, club, qnty AS q1 FROM (SELECT cid, club, sum(qnty) AS q2, row_number() OVER (PARTITION BY cid ORDER BY sum(q2) DESC) AS seqnum FROM yrb_purchase GROUP BY cid, club) cc WHERE seqnum = 1
我收到错误:SQL0206N "Q2" is not valid in the context where it is used. SQLSTATE=42703
目前正致力于弄清楚如何解决这个问题。
答案 0 :(得分:1)
您要查找的值有一个名称。统计上,它被称为"模式"。
如果我理解正确,您需要每个club
的总数量,然后是每个cid
最高的数量。您可以使用row_number()
或rank()
,具体取决于您希望如何处理关系:
select cid, club, qty
from (select cid, club, sum(qty) as qty,
row_number() over (partition by cid order by sum(qty) desc) as seqnum
from t
group by cid, club
) cc
where seqnum = 1;
如果存在关联且您想要所有值,请使用rank()
代替row_number()
。