You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:38:52