用SQL查询每家公司的最早创建账户
查询每家公司最早创建账户的SQL实现
嘿,我来帮你搞定这个查询需求!要找出每家公司最早创建的用户账户,我们需要把Users和Policies关联起来,再按公司分组筛选出最早的记录。这里有两种实用的方案,适配不同的数据库环境:
方案一:用窗口函数(推荐给支持现代SQL的数据库)
如果你的数据库是MySQL 8.0+、PostgreSQL、SQL Server这类支持窗口函数的,这个方法代码更清晰,逻辑也直观:
WITH ranked_users AS ( SELECT u.id AS user_id, p.companyId, u.createdAt AS user_created_at, u.policyId, -- 按公司分组,每组内按用户创建时间升序排,给第一条打标记 ROW_NUMBER() OVER (PARTITION BY p.companyId ORDER BY u.createdAt ASC) AS row_rank FROM Users u -- 关联政策表,拿到用户对应的公司ID INNER JOIN Policies p ON u.policyId = p.id ) -- 筛选出每个公司的第一条记录(最早创建的用户) SELECT user_id, companyId, user_created_at, policyId FROM ranked_users WHERE row_rank = 1;
为啥推荐这个?
- 窗口函数
ROW_NUMBER()能精准给每个公司的用户按创建时间排序,直接取序号1的就是最早的那个; - 代码结构清晰,后期维护起来也方便。
方案二:用子查询(兼容旧版数据库)
要是你用的是MySQL 5.x这类不支持窗口函数的老版本数据库,就用这个子查询的方式:
SELECT u.id AS user_id, p.companyId, u.createdAt AS user_created_at, u.policyId FROM Users u INNER JOIN Policies p ON u.policyId = p.id -- 关联子查询得到的每家公司最早创建时间 INNER JOIN ( SELECT p_inner.companyId, MIN(u_inner.createdAt) AS earliest_create_time FROM Users u_inner INNER JOIN Policies p_inner ON u_inner.policyId = p_inner.id -- 按公司分组,计算每组的最早用户创建时间 GROUP BY p_inner.companyId ) AS company_first ON p.companyId = company_first.companyId AND u.createdAt = company_first.earliest_create_time;
小提醒:
如果同一家公司有多个用户在完全相同的时间创建账户,方案一只会返回其中一条,而方案二会把这些同时创建的用户都查出来。你可以根据实际业务需求选对应的方法~
内容的提问来源于stack exchange,提问作者Reyes Garcia
相关产品推荐
相关产品推荐

