如何在 SQL 中找到没有聚合函数的最小值?

Posted

技术标签:

【中文标题】如何在 SQL 中找到没有聚合函数的最小值?【英文标题】:How to find lowest value without aggregate function in SQL? 【发布时间】:2020-11-24 03:30:22 【问题描述】:

我在 Postgres 上有这个示例数据集

 updated_at     activated_at        name     gender   role    school  app_name    device_type
-------------+-----------------+----------+--------+-------+---------+---------+---------------
August 2         July 30            Ron        M       S        A         Y          android
August 1         July 30            Ron        M       S        A         Z          browser
July 30          July 30            Ron        M       S        A         Y          android
August 1         July 28            Ana        F       S        B         Y          android
August 1         July 28            Ana        F       S        B         Z          browser
July 28          July 28            Ana        F       S        B         Y          android

我想知道用户在激活后第一次显示(updated_at)是什么时候,并且属于哪个应用程序。

预期结果:

 updated_at     activated_at        name     gender   role    school  app_name    device_type
-------------+-----------------+----------+--------+-------+---------+---------+---------------
July 30          July 30            Ron        M       S        A         Y          android
July 28          July 28            Ana        F       S        B         Y          android

我试过这个 SQL:

SELECT min(ut.updated_at), u.activated_at, u.full_name, u.gender, r.name, s.name, ut.app_name, ut.device_type
FROM "public"."user_tokens" ut JOIN
     "public"."users" u
     ON ut.user_id = u.id JOIN
     "public"."user_roles" ur
     ON ut.user_id = ur.user_id JOIN
     "public"."roles" r
     ON ur.role_id = r.id JOIN
     "public"."schools" s
      ON ur.school_id = s.id
WHERE (NOT (ut.app_name) like 'G')
Group by u.activated_at, u.full_name, u.gender, r.name, s.name, ut.app_name, ut.device_type
Order by u.activated_at desc

但结果是这样的:

 updated_at     activated_at        name     gender   role    school  app_name    device_type
-------------+-----------------+----------+--------+-------+---------+---------+---------------
August 1         July 30            Ron        M       S        A         Z          browser
July 30          July 30            Ron        M       S        A         Y          android
August 1         July 28            Ana        F       S        B         Z          browser
July 28          July 28            Ana        F       S        B         Y          android

我试图从 group by 子句中排除 app_namedevice_type,但它显示 ERROR: column "ut.app_name" must appear in the GROUP BY clause or be used in an aggregate function

知道如何解决吗?任何输入将不胜感激。谢谢。

【问题讨论】:

您也可以在PostgreSQL 中使用row_number() 执行此操作 【参考方案1】:

我认为DISTINCT ON 可能是在 Postgres 上执行此操作的最佳方式:

SELECT DISTINCT ON (u.full_name)
    ut.updated_at,
    u.activated_at,
    u.full_name,
    u.gender,
    r.name,
    s.name,
    ut.app_name,
    ut.device_type
FROM "public"."user_tokens" ut
INNER JOIN "public"."users" u ON ut.user_id = u.id
INNER JOIN "public"."user_roles" ur ON ut.user_id = ur.user_id
INNER JOIN "public"."roles" r ON ur.role_id = r.id
INNER JOIN "public"."schools" s ON ur.school_id = s.id
WHERE NOT ut.app_name LIKE 'G'
ORDER BY
    u.full_name,
    ut.updated_at;

上面会为每个全名用户返回一条记录,对应更早的updated_at时间。

【讨论】:

【参考方案2】:

您可以先升序(从旧到新)排序,然后使用 LIMIT 来确定要显示多少记录

select * from TABLE_NAME order by updated_at asc LIMIT 2;

【讨论】:

以上是关于如何在 SQL 中找到没有聚合函数的最小值?的主要内容,如果未能解决你的问题,请参考以下文章

不使用聚合函数 SQL 的最小值 [关闭]

PCB MS SQL CLR聚合函数(函数作用,调用顺序,调用次数) CLR说明

sql - 使用聚合函数(最小值/最大值)作为选择语句的一部分

SQL Server中的聚合函数都有哪些?

SQL Server报错:选择列表中的列无效,因为该列没有包含在聚合函数或 GROUP BY 子句中

sql server中啥是聚合函数