SQL-使用GROUPBY和MIN COUNT返回计数最少的变量
我在使用SQL-使用GROUPBY和MIN COUNT返回计数最少的变量,sql,postgresql,count,group-by,min,Sql,Postgresql,Count,Group By,Min,我在使用分组依据、最大值和计数时遇到问题 我有三张表,t1,t2,t3,有营养数据 t1包含userid t2包含食品和食品的类型。(水果、肉等) t3记录用户ID每次进食的时间,因此userid,食物 如何编写一个(Postgres)查询,只返回用户ID和最少吃的食物类型 我一直被困在groupby上,因为聚合会产生各种食物的组合。关于我应该如何处理这个问题,有什么提示吗?如果您想要每个用户吃得最少的食物类型,首先按用户和类型统计出现次数,然后需要使用秩函数来确定哪些食物类型的数量最少。我
分组依据
、最大值
和计数
时遇到问题
我有三张表,t1,t2,t3,有营养数据
- t1包含
userid
- t2包含
和食品的食品
。(水果、肉等)类型
- t3记录用户ID每次进食的时间,因此
,userid
食物
用户ID
和最少吃的食物类型
我一直被困在
groupby
上,因为聚合会产生各种食物的组合。关于我应该如何处理这个问题,有什么提示吗?如果您想要每个用户吃得最少的食物类型,首先按用户和类型统计出现次数,然后需要使用秩函数来确定哪些食物类型的数量最少。我不想费心写出所有的连接,但是这个伪代码应该有帮助:
select userid, max(c_type) as MaxType
From (Select userid, count(type) as c_type
from t1 inner join t3 on t1.userid = t3.userid
inner join t2 on t2.food = t3.food
group by userid) as T
group by userid
select user_id, type, type_total
from ( select user_id, type, type_total,
rank(type_total) over (partition by user_id, type order by type_total) rn
from ( select user_id, type, count(t3 identifier) type_total
from [insert all the tables and joins here]
group by user_id, type ) x
) y
where y.rn = 1
此方法使用ROW_NUMBER window函数,对按类型分组的食用食物计数进行升序排序,以确定最少食用的食物。如果出现平局,将从最少的类型中随机选择一个。使用@htf发布的解决方案中的类似排名将返回所有关系
select userid, type from (
select t3.userid, t2.type, count(*) as eaten,
row_number() over(partition by t3.userid order by count(t3.food) asc) AS r
from t3 join t2 on t3.food=t2.food
group by 1,2
) least
where r=1
假设您希望从t1中得到一些东西,则如下所示:
select t1.name, least.type from (
select t3.userid, t2.type, count(*) as eaten,
row_number() over(partition by t3.userid order by count(t3.food) asc) AS r
from t3 join t2 on t3.food=t2.food
group by 1,2
) least
join t1 on t1.userid=least.userid
where least.r=1
下面是一种不使用窗口功能的方法。这种方法使用对吃的类型计数的自联接来识别吃得最少的食物,并过滤其他更频繁吃的食物(添加t1,假设您需要一些字段):
此版本将包括最少被吃掉的关系。当您需要sql查询时,请发布一些示例数据和预期结果,并向我们展示您已尽可能尝试的内容。t4包含解决方案。您不必重新发明轮子,这是一个典型的查询(有),只需反转运算符以查找最少的,而不是最伟大的。
with type_counts as (
select t3.userid, t2.type, count(*) as eaten,
from t3 join t2 on t3.food=t2.food
group by 1,2
)
select t1.username, tc.userid, tc.type
from type_counts tc
inner join (select userid, min(eaten) as eaten from type_counts group by 1) mintc
on tc.userid=mintc.userid and tc.eaten=mintc.eaten
inner join t1 on t1.userid=tc.userid