返回结果集中第一个出现的用户id

5uzkadbs  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(611)

我有两张table(简化为):

  1. +----------------+
  2. | attendances |
  3. +-----+----------+
  4. | int | user_id |
  5. +-----+----------+
  6. | int | event_id |
  7. +-----+----------+
  8. +-------------------------+
  9. | events |
  10. +------+------------------+
  11. | int | id |
  12. +------+------------------+
  13. | date | performance_date |
  14. +------+------------------+

还有一个简单的查询:

  1. SELECT count(DISTINCT user_id), events.performance_date
  2. FROM attendances
  3. INNER JOIN events
  4. ON event_id = events.id
  5. GROUP BY performance_date

我只想数一数 user_id 一次,但上面的查询只从每个 performance_date (允许它们跨多个日期复制)。
是否有一个查询可以从整个结果集中删除重复的用户ID,并且只包括第一次出现的(按日期)?我怀疑这不可能。

输入/输出示例:

如果用户在2010年10月10日和2010年10月11日参加了一次活动,那么结果将是:

  1. 1, 2010-10-10

不是:

  1. 1, 2010-10-10
  2. 1, 2010-10-11

或:

  1. 2, 2010-10-10

如果在上面添加了另一个用户,并且他们在2010-10-10和2010-10-12参加了会议,那么结果将是:

  1. 2, 2010-10-10
  2. 1, 2020-10-12

正如我所说,这可能是不可能的。实际的产出并不是严格意义上的重要——只要能够以某种方式得出参加某一特定表演的人数。
这些数据将用于构建一个按事件统计的唯一用户数量增长的累积图。

dfddblmv

dfddblmv1#

如果需要每个用户的最早日期,可以使用聚合:

  1. select u.id user_id, min(e.date) first_event_date
  2. from users u
  3. inner join events e on u.event_id = e.id
  4. group by u.id

实际上,您可能要查找直方图,即每个最早事件日期的用户数。您可以通过添加另一个聚合级别来实现这一点:

  1. select first_event_date, count(*) no_users
  2. from (
  3. select min(e.date) first_event_date
  4. from users u
  5. inner join events e on u.event_id = e.id
  6. group by u.id
  7. ) t
  8. group by first_event_date
hjzp0vay

hjzp0vay2#

如果要统计每个事件的所有新用户,可以使用以下查询:

  1. SELECT Count(u.user_id),
  2. e.performance_date
  3. FROM attendances u
  4. INNER JOIN `events` e
  5. ON u.event_id = e.id
  6. WHERE NOT EXISTS(SELECT u1.user_id
  7. FROM attendances u1
  8. INNER JOIN `events` e1
  9. ON u1.event_id = e1.id
  10. WHERE u1.user_id = u.user_id
  11. AND e1.performance_date < e.performance_date)
  12. GROUP BY performance_date
  13. ORDER BY performance_date

我用以下一组测试了它:

  1. CREATE TABLE attendances
  2. (
  3. user_id INT,
  4. event_id INT
  5. );
  6. CREATE TABLE `events`
  7. (
  8. id INT,
  9. performance_date DATE
  10. );
  11. INSERT INTO attendances
  12. (user_id,
  13. event_id)
  14. VALUES ( 1, 1),
  15. ( 1, 2),
  16. ( 2, 1),
  17. ( 2, 2),
  18. ( 3, 1),
  19. ( 4, 2);
  20. INSERT INTO `events`
  21. (id,
  22. performance_date)
  23. VALUES ( 1, '2020-07-24'),
  24. ( 2, '2020-07-25');

结果是

  1. 3 2020-07-24
  2. 1 2020-07-25
展开查看全部

相关问题