Sql 对元素进行计数并找出最大值
我有一张这样的桌子:Sql 对元素进行计数并找出最大值,sql,hive,Sql,Hive,我有一张这样的桌子: +-----+-----+-----+ | uid | aid | tid | +-----+-----+-----+ | 1 | 6 | 7 | +-----+-----+-----+ | 2 | 6 | 7 | +-----+-----+-----+ | 3 | 5 | 7 | +-----+-----+-----+ | 4 | 5 | 7 | +-----+-----+-----+ | 5 | 5 | 7 |
+-----+-----+-----+
| uid | aid | tid |
+-----+-----+-----+
| 1 | 6 | 7 |
+-----+-----+-----+
| 2 | 6 | 7 |
+-----+-----+-----+
| 3 | 5 | 7 |
+-----+-----+-----+
| 4 | 5 | 7 |
+-----+-----+-----+
| 5 | 5 | 7 |
+-----+-----+-----+
我希望找到,对于每个tid,哪个援助有更多的元素。
例如,我知道tid 7有2倍于aid 6,如下所示
+
我期望的最终结果是753,因为我想要最大计数
我通过两个查询实现了我想要的结果:
CREATE TABLE temp AS
SELECT tid, aid, count(aid) as c
FROM startingtable
GROUP BY tid, aid
ORDER BY tid, aid;
然后
CREATE TABLE result AS
select a.tid, a.aid, a.c
from temp a
inner join
(SELECT tid, max(c) as m
FROM temp
GROUP BY tid) b
on a.tid = b.tid and a.c = b.m
order by tid;
我需要它是功能性的,只使用一个查询。你会怎么做
谢谢您的时间。您可以尝试将自连接与子查询一起使用
CREATE TABLE temp AS
SELECT t1.*
FROM (
SELECT tid,
aid,
count(aid) as cnt
FROM startingtable
GROUP BY tid, aid
) t1 JOIN (
SELECT tid,
MAX(cnt) maxcnt
FROM (
SELECT tid,
aid,
count(aid) as cnt
FROM startingtable
GROUP BY tid, aid
) t2
GROUP BY tid
)t2 ON t1.tid = t2.tid and t1.cnt = t2.maxcnt
另一种方法是尝试使用CTE
和Row\u number
窗口函数将数据插入表中
WITH CTE AS (
SELECT tid,
aid,
count(aid) as cnt
FROM startingtable
GROUP BY tid, aid
)
insert into #temp (tid,aid,cnt)
select t2.tid,
t2.aid,
t2.cnt
from (
SELECT *,ROW_NUMBER() OVER(PARTITION BY tid order by cnt desc) rn
FROM CTE
) t2
where rn = 1
使用rank()
分析函数:
select tid, aid, c
from
(
select tid, aid, c,
rank() over(partition by tid order by c desc) rnk --max(c) per tid ranked 1
from
(
SELECT tid,
aid,
count(aid) as c
FROM startingtable
GROUP BY tid, aid
)s
)s where rnk=1;
你可以试试下面的答案,这似乎比其他答案简单一些,但我可能遗漏了一些东西
SELECT * FROM (
SELECT tid, aid, count(*)
FROM test
GROUP BY tid, aid
ORDER BY count(*) DESC)
WHERE rownum = 1;
试试这个:
SELECT tid, aid, COUNT(*) AS elCount FROM startingtable
GROUP BY tid, aid
表示逻辑的最简单方法是使用窗口函数:
SELECT tid, aid, cnt
FROM (SELECT tid, aid, COUNT(*) as cnt,
ROW_NUMBER() OVER (PARTITION BY tid ORDER BY COUNT(*) DESC) as seqnum -- or maybe RANK()
FROM startingtable t
GROUP BY tid, aid
) t
WHERE seqnum = 1;
逻辑只需要一级子查询/CTE。这就像一个符咒。但有一个问题:我尝试了好几次子查询,但都不起作用。您的子查询工作正常。我错过什么了吗?
SELECT tid, aid, cnt
FROM (SELECT tid, aid, COUNT(*) as cnt,
ROW_NUMBER() OVER (PARTITION BY tid ORDER BY COUNT(*) DESC) as seqnum -- or maybe RANK()
FROM startingtable t
GROUP BY tid, aid
) t
WHERE seqnum = 1;