sql - 如何连接条件不相等的表?

标签 sql postgresql greatest-n-per-group

我正在尝试使用应用版本详细信息查询所有首次成功安装应用的用户。

所以我尝试查询用户首次成功安装的情况,然后将installed_date与installed_date之前的最新应用版本进行比较。

SELECT DISTINCT user_id, installed_time
WHERE state=SUCCESSFUL
FROM installation
ORDER BY ASC

上面的查询返回所有第一次成功安装的用户。

我如何找到他们首次成功安装时安装的应用程序版本?

我的表格描述如下:

Installation:
user_id,
installed_date,

Version:
version_id,
release_date,
release_code,

最佳答案

我不相信这个查询会按照你说的做:

SELECT DISTINCT user_id, installed_time
WHERE state=SUCCESSFUL
FROM installation
ORDER BY ASC;

除了明显的语法错误外,多次安装的用户会出现多次。这可能是您想要的,但这不是第一次成功安装。

我认为查询应该是:

SELECT i.user_id, MIN(i.installed_time)
FROM installation i
WHERE i.state = 'SUCCESSFUL'
GROUP BY i.user_id;

或者,如果您想要表中的所有列,请使用 DISTINCT ON:

SELECT DISTINCT ON (i.user_id) i.*
FROM installation i
WHERE i.state = 'SUCCESSFUL'
ORDER BY i.user_id, i.installation_time

如果你想要当时的有效版本,你有几种选择。在 Postgres 中,我建议使用横向连接:

SELECT i.*, v.*
FROM (SELECT i.user_id, MIN(i.installed_time) as installed_time
      FROM installation i
      WHERE i.state = 'SUCCESSFUL'
      GROUP BY i.user_id
     ) i LEFT JOIN LATERAL
     (SELECT v.*
      FROM versions v
      WHERE v.release_date <= i.installed_time
      ORDER BY v.release_date DESC
      FETCH FIRST 1 ROW ONLY
     ) v
     ON 1=1;

关于sql - 如何连接条件不相等的表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55879056/

相关文章:

php - MySQL 当前和上个月从日期开始的第一天和最后一天(无时间戳)

java - Alter Session 在 MyBatis 中设置日期格式

postgresql - 如何将 CSV 文件中的数据自动填充到 PostgreSQL?

php - 如何改善此MySQL查询?

sql - PostgreSQL:同一表中每个项目的前 n 个条目

sql - 选择前 10 行,然后决定之后要包含哪些行

c# - 数据绑定(bind)到数据表或gridview时出错

sql - 如何在 SQL 中生成数字列表,因为它是一个理解列表?

Postgresql滚动删除旧行?

php - pg_query() : Query failed: ERROR: operator does not exist: integer ~~ unknown\n