Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-使用GROUPBY和MIN COUNT返回计数最少的变量_Sql_Postgresql_Count_Group By_Min - Fatal编程技术网

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
    食物
如何编写一个(Postgres)查询,只返回
用户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