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

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

我有两张table(简化为):

+----------------+
| attendances    |
+-----+----------+
| int | user_id  |
+-----+----------+
| int | event_id |
+-----+----------+

+-------------------------+
| events                  |
+------+------------------+
| int  | id               |
+------+------------------+
| date | performance_date |
+------+------------------+

还有一个简单的查询:

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

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

输入/输出示例:

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

1, 2010-10-10

不是:

1, 2010-10-10
1, 2010-10-11

或:

2, 2010-10-10

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

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

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

dfddblmv

dfddblmv1#

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

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

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

select first_event_date, count(*) no_users
from (
    select min(e.date) first_event_date
    from users u
    inner join events e on u.event_id = e.id
    group by u.id
) t
group by first_event_date
hjzp0vay

hjzp0vay2#

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

SELECT Count(u.user_id), 
       e.performance_date 
FROM   attendances u 
       INNER JOIN `events` e 
               ON u.event_id = e.id 
WHERE  NOT EXISTS(SELECT u1.user_id 
                  FROM   attendances u1 
                         INNER JOIN `events` e1 
                                 ON u1.event_id = e1.id 
                  WHERE  u1.user_id = u.user_id 
                         AND e1.performance_date < e.performance_date) 
GROUP  BY performance_date 
ORDER  BY performance_date

我用以下一组测试了它:

CREATE TABLE attendances 
  ( 
     user_id  INT, 
     event_id INT 
  ); 

CREATE TABLE `events` 
  ( 
     id               INT, 
     performance_date DATE 
  ); 

INSERT INTO attendances 
            (user_id, 
             event_id) 
VALUES      ( 1, 1),
            ( 1, 2),
            ( 2, 1),
            ( 2, 2),
            ( 3, 1),
            ( 4, 2);

INSERT INTO `events` 
            (id, 
             performance_date) 
VALUES      ( 1, '2020-07-24'), 
            ( 2, '2020-07-25');

结果是

3  2020-07-24
1  2020-07-25

相关问题