我有一个包含多个列的表格。这是一个例子(列数较少):
PROTOCOL LINE_FORMAT SERVICE MSISDN
c3p0 solid cyborg 639275487638
r2r2 rounded amech 639124512070
c3pX etc.. etc.. 639275487638
bxSer hard comm 639200020006
现在,MSISDN发生了两次。据推测,结果应该只包含一个唯一的MSISDN,而不管其他数据 - 尽管这并不意味着不需要其他数据。
以下是我的尝试:
SELECT max(PROTOCOL), max(LINE_FORMAT), max(NEURALITIC), max(OP_SERVICE1), max(OP_SERVICE2), max(OP_SERVICE3), max(DATESTAMP), max(APP_NAME), max(IMSI), MSISDN, max(OP_ID), max(OP_LOCATION_ID), max(ROAMER_FLAG), max(TAC), max(LOCATION_LAYER1), max(LOCATION_LAYER2), max(LOCATION_LAYER3), max(LOCATION_LAYER4), max(LOCATION_LAYER5), max(SGSN), max(GGSN), max(APN), max(WEBDOMAIN), max(PROBE_NAME), max(FILE_ID), max(RAT), max(OUT_BYTES), min(IN_BYTES), max(TRANSACTION_COUNT)
FROM june21dataloader WHERE NEURALITIC LIKE "%Application Usage%" AND WEBDOMAIN LIKE "%bpiexpressonline.com%" GROUP BY MSISDN;
现在,当我尝试这个时,我很确定我有独特的流氓 - 因为原始的2000万行,它只返回了2900左右。
令人不安,当预计输出至少 6k ++
时这里有点腥。我的查询有问题吗?如果我放弃max()'会发生什么?
现在,我的问题是,做这项工作的其他方式是什么?据我所知,DISTINCT
似乎只在一个列上工作,而GROUP BY
一直在询问所有列名称(我甚至不确定是否它将产生一个独特的MSISDN)。
感谢。
答案 0 :(得分:1)
您可以执行类似
的操作SELECT * FROM
(SELECT *, RANK() OVER (PARTITION BY MSISDN ORDER BY <CreatedDateOrSomething>) AS Rank
FROM <Your_Table>) AS SUBQUERY
WHERE Rank = 1
这将为每个MSISDN提供一个条目。其余列将是具有最小CreatedDateOrSomething
的条目的数据但如果其他数据无关紧要,那你为什么不做呢
SELECT DISTINCT(MSISDN) FROM <Your_Table>