对于常见元素,如何根据两列查找值? SQL

时间:2017-03-05 14:04:01

标签: sql db2

我正在使用IBM的DB2;但我希望这可以使用SQL标准完成,而不使用每个数据库制造商添加的附加功能。

我的问题:

对于每个CID(客户ID),我需要找到购买次数最多的CLUB。

在下表中,客户#1(' cid = 1')从俱乐部购买了大部分图书'读者摘要'。我可以使用Find most frequent value in SQL column

完成此部分

enter image description here

然而CID = 2对我来说要困难得多,而且我被卡住了。对于' cid = 2'我们可以看到“俱乐部”中最常出现的刺痛。专栏是奥普拉'之间的纽带。和' YRB Gold' - 但是当我们看到QNTY'专栏(对人们来说)显而易见的是,#cid = 2'是'YRB_gold'。 ' YRB_GOLD'卖了5本书,其中' OPRAH'只卖了4本书。

enter image description here

我把'cid = 3'在这里:

enter image description here

有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

目前正致力于弄清楚如何解决这个问题。

1 个答案:

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