2017-03-05 35 views
0

我正在使用IBM的DB2;但是我希望这可以使用SQL标准来完成,而不使用每个数据库制造商添加的附加功能。对于常见的元素,如何找到基于两列的值? SQL

我的问题:

对于每一个CID(客户ID),我需要从中找到最购买作了俱乐部。

在下表中,客户#1('cid = 1')从俱乐部'读者文摘'购买了大部分书籍。我能得到这个部分使用做:Find most frequent value in SQL column

enter image description here

然而CID = 2是多少(对我来说)硬,我坚持。对于'cid = 2',我们可以看到'CLUB'栏下最常出现的刺痛是'Oprah'和'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'下最常出现的字符串,同时还要跟踪每个俱乐部的'QNTY'?如果您选择提供帮助,您能否提供最贴牌的中性答案?先谢谢你。

******************************编辑#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

您正在查找的值有一个名称。统计上,它被称为“模式”。

如果我理解正确,您需要每个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()