SQL 按选择分组

标签 sql sql-server tsql

我正在使用 SQL Server,并且我有一个包含以下列的表:

SessionId | Date | first name | last name 

我想要按 sessionId 进行分组,然后获取具有最大日期的行。

例如:

xxx | 21/12/2012 | f1 | l1
xxx | 20/12/2012 | f2 | l2
yyy | 21/12/2012 | f3 | l3
yyy | 20/12/2012 | f4 | l4

我想获得以下行:

xxx | 21/12/2012 | f1 | l1
yyy | 21/12/2012 | f3 | l3

谢谢

最佳答案

试试这个:

WITH MAXSessions
AS
(
  SELECT 
    *,
    ROW_NUMBER() OVER(PARTITION BY SessionID ORDER BY Date DESC) rownum
  FROM Sessions
)
SELECT
  SessionId,
  Date,
  firstname,
  lastname 
FROM MAXSessions
WHERE rownum = 1;

或者:

SELECT 
  s.SessionId,
  s.Date,
  s.firstname,
  s.lastname 
FROM Sessions s
INNER JOIN
(
   SELECT SessionID, MAX(Date) LatestDate
   FROM sessions
   GROUP BY SessionID
) MAxs  ON maxs.SessionID  = s.SessionID
       AND maxs.LatestDate = s.Date;
<小时/>

更新:要获取 session 计数,您可以执行以下操作:

SELECT 
  s.SessionId,
  s.Date,
  s.firstname,
  s.lastname,
  maxs.SessionsCount
FROM Sessions s
INNER JOIN
(
   SELECT SessionID, COUNT(SessionID), SessionsCount, MAX(Date) LatestDate
   FROM sessions
   GROUP BY SessionID
) MAxs  ON maxs.SessionID  = s.SessionID
       AND maxs.LatestDate = s.Date;

关于SQL 按选择分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14111189/

相关文章:

PHP While 在另一个内部循环,并且第一个 while 不返回其他值

mysql - 在 sql 查询中应用 if 条件

php - 在 PHP 中对 SQL 结果集进行分组

sql-server - SQL Server 2012 中带有空值的移动平均值

Sql选择包含部分字符串的行

sql-server - 如何在 SQL 中计算 IPv6 CIDR 路由前缀?

mysql - 从满足某些要求的表中获取数据

sql - 帮我找到数据 block

asp.net - '.'附近的sql数据库语法错误

sql-server-2005 - 你如何设置 CONTEXT_INFO = NULL?