查询回访用户、第一条记录和最后一条记录

Posted

技术标签:

【中文标题】查询回访用户、第一条记录和最后一条记录【英文标题】:Query returning users, first record and last record 【发布时间】:2013-02-06 20:44:48 【问题描述】:

我正在尝试编写一个查询,显示我们的唯一用户、他们在系统中首次记录条目的日期以及他们最后一次记录条目的日期。它们分为两个表:用户表和日志表。

用户:

| Userid | Username    |
|--------|-------------|
|20      | Tom Smith   |
|21      | Jim Jones   |
|22      | Sandy Brown |

日志:

| Logid | UserID  | Date       | Value        |
--------|---------|------------|--------------|
| 1     | 21      | 01/03/2013 | Login        |
| 2     | 22      | 01/04/2013 | Login        |
| 3     | 21      | 01/05/2013 | Edit         |
| 4     | 20      | 01/06/2013 | Login        |
| 5     | 20      | 01/07/2013 | Search       |
| 6     | 22      | 01/08/2013 | Login        |
| 7     | 21      | 01/09/2013 | Close        |
| 8     | 21      | 01/11/2013 | Login        |
| 9     | 20      | 01/12/2013 | Edit         |
| 10    | 22      | 01/13/2013 | Search       |

这是我正在尝试编写的查询的预期结果:

|Userid | UserName    | First Log Date | Last Log Date |
|-------|-------------|----------------|---------------|
| 20    | Tom Smith   | 01/06/2013     | 01/12/2013    |
| 21    | Jim Jones   | 01/03/2013     | 01/11/2013    |
| 22    | Sandy Brown | 01/04/2013     | 01/13/2013    |

到目前为止,我有前两列,但是我无法弄清楚第一和最后日期列,以下是我目前的查询:

select 
    distinct(u.userid1) as 'Userid',
    u.username as 'UserName'
from 
    users u,
    log l
where
    u.userid = l.userid

我正在使用 SQL Server 2008。我希望得到一些帮助。

【问题讨论】:

【参考方案1】:

只需获取每条记录的日期的minmax

select 
    u.userid as [Userid],
    u.username as [UserName],
    min([Date]) as [First Log Date],
    max([Date]) as [Last Log Date]
from users u 
inner join log l on u.userid = l.userid
group by u.userid, u.username 

【讨论】:

完美答案。非常感谢。 不需要与 group by 区分,但它仍然有效。 @LittleBobbyTables:实际上,这似乎来自原始示例中的查询(您可能只是没有注意到)。无论哪种方式,它都有效,干得好。 不推荐使用隐式连接等sql反模式。 @HLGEM - 你说得对,我很草率地复制并粘贴了用户的查询,但仍然完好无损。我已经更新了我的答案,将来会更加勤奋。太尴尬了:|【参考方案2】:

您只需要应用一个聚合函数来获取minmax 日期,然后是group by u.userid, u.username

select u.userid as 'Userid',
  u.username as 'UserName',
  min(l.date) FirstDate,
  max(l.date) lastDate
from users u
inner join log l
  on u.userid = l.userid
group by u.userid, u.username

见SQL Fiddle with Demo

【讨论】:

【参考方案3】:

你只需要一个group by:

select u.userid, u.username,
       MIN(date) as FirstLogDate, MAX(date) as MaxLogDate
from users u join
     log l
      on u.userid = l.userid
group by u.userid, u.username      

【讨论】:

以上是关于查询回访用户、第一条记录和最后一条记录的主要内容,如果未能解决你的问题,请参考以下文章

如何使用聚合函数在 MySQL 查询中获取分组记录的第一条和最后一条记录?

mysql中如何查询表的第一条和最后一条记录

如何从 sql 查询中获取第一条和最后一条记录?

postgresql某数据表中有多天的记录存在,我想取某天的第一条和最后一条记录,数据库查询语句怎么写

oracle 取第一条或者最后一条记录

返回子查询中的最后一条记录 - MySQL