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;