sql语句,求出现次数最多的组中,出现次数最多的一条数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql语句,求出现次数最多的组中,出现次数最多的一条数据相关的知识,希望对你有一定的参考价值。
求写sql语句,求出现次数最多的组中,出现次数最多的一条数据。
描述:
sender 是发信人,receiver是收信人,求一个sender,给收到最多信息的人,发的信息最多?
我的思路是,对receiver 分组 count下,得到最大的那个receiver。以此作为条件,把sender 分组 count 一下求最大的那个sender。 面试官说还有更高效的解法。求更高效的解法?
由于这里有count()函数的存在,我想弄exist可是我写不出来。求各位广开思路。
数据表如下:
我写的sql语句如下(可以求得结果,面试官说可以优化):
select top 1 sender,COUNT(sender) as senderCount from tb_A a join (select top 1 receiver, count(receiver) as count from tb_A group by receiver order by count desc) b on a.receiver = b.receiver group by sender order by senderCount
我的sql语句,最后落下了一个 desc
你呢回答我有3个疑问。1.语法可能不对。2.不合题意,是receiver数最多的那个组中sender数最多。3.你的效率并不比我高
追答语法确实有问题,因为手边没有环境测试,不知是我的语文是体育老师教的还是怎么的,没看明白题目,你好歹给个结果啊,不然看不明白题目也是愁。
参考技术B 结果是什么leetcode 169. Majority Element 求出现次数最多的数 --------- java
Given an array of size n, find the majority element. The majority element is the element that appears more than ? n/2 ?
times.
You may assume that the array is non-empty and the majority element always exist in the array.
给定一个数组,求其中权制最大的元素,(该元素出现超过了一半次数)。
直观想法,HashMap,很慢
public class Solution { public int majorityElement(int[] nums) { Map map = new HashMap<Integer, Integer>(); int len = nums.length; if (len == 1){ return nums[0]; } for (int num : nums){ if (map.containsKey(num)){ int count = (int) map.get(num); if ((count + 1) > len / 2){ return num; } else { map.put(num, count + 1); } } else { map.put(num, 1); } } return -1; } }
discuss上面看到了这道题非常完善的总结:
1、排序sort
public int majorityElement1(int[] nums) { Arrays.sort(nums); return nums[nums.length/2]; }
2、HashMap
3、Moore’s voting algorithm(最佳算法)
很巧妙,时间O(n) ,空间O(1),就是记录当前元素以及当前元素的“胜出”数量(比其他元素多几个)。
public int majorityElement3(int[] nums) { int count=0, ret = 0; for (int num: nums) { if (count==0) ret = num; if (num!=ret) count--; else count++; } return ret; }
4、位运算 Bit manipulation
通过记录每一位上的数字来得出的结果,相比之下,还是第三种算法更好。
public int majorityElement(int[] nums) { int[] bit = new int[32]; for (int num: nums) for (int i=0; i<32; i++) if ((num>>(31-i) & 1) == 1) bit[i]++; int ret=0; for (int i=0; i<32; i++) { bit[i]=bit[i]>nums.length/2?1:0; ret += bit[i]*(1<<(31-i)); } return ret; }
以上是关于sql语句,求出现次数最多的组中,出现次数最多的一条数据的主要内容,如果未能解决你的问题,请参考以下文章
leetcode 169. Majority Element 求出现次数最多的数 --------- java