sql - 如何在SQL Server中选择每个id组的前2个

标签 sql sql-server

我有以下查询并针对每个 id
我得到了超过 3 个 Action /代码
你能告诉我如何获得前两名吗
通过使用 select 语句而不是针对每个 id 的操作
写程序

SELECT     id, 
           code,
           date,
           des
FROM         accounts INNER JOIN
                      accdesc ON accoints.code = accdesc.act_cd
ORDER BY accounts.id

查询返回以下数据
id  code    date        desc 

609 AG1     2005-11-07  a                    
609 AG2     2004-11-12  a clear                 
609 AG2     2002-04-28  a clear                 
609 AG2     1998-07-20  a clear                 
609 AG2     1998-03-16  a clear                 
627 AG9     2010-02-24  a9
627 AONOSP  2010-02-19  possession  
627 AONSPV  2010-02-24  visit            
627 SP AG1  2007-11-01  agreement                  
627 AONSPV  2010-02-22  visit            

我想要每个 id 的前 2 个
id  code    date        desc 
609 AG1     2007-11-07  a                    
609 AG2     2002-11-12  a clear               

627 AONOSP  2010-02-19  a9  
627 AONSPV  2010-02-24  poessession           

最佳答案

在 SQL 2005 及更高版本中,您可以使用 ROW_NUMBER超过 partition在您感兴趣的分组 ( id ) 上为组中的每一行编号,然后您可以将其滚动到 CTE 或派生表中,然后使用外部查询进行过滤:

SELECT 
  x.id, x.code, x.date, x.des
FROM
(
  SELECT 
    ROW_NUMBER() OVER (PARTITION BY Id ORDER BY accounts.id) as rownum,
    id, code, date, des
  FROM accounts
    INNER JOIN accdesc 
    ON accounts.code = accdesc.act_cd 
) x -- Derived Table
WHERE 
   rownum <= 2; -- How many rows of each group

请注意,您需要对订购发表意见(ORDER BY 是强制性的)

关于sql - 如何在SQL Server中选择每个id组的前2个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7689415/

相关文章:

mysql - 根据参与者查找现有的消息 channel

sql - 使用批量插入时如何修剪空格?

asp.net - 连接到防火墙后面的 MSSQL 服务器

mysql - LEFT JOIN 显示与 RIGHT JOIN 不同的结果 - 当自己连接表时......为什么?

sql-server - sql server 2012 - 无法对多语句表值函数的选择授予

sql-server - 分区数据压缩

sql - 将表达式转换为数据类型日期时间时出现算术溢出错误

sql - PostgreSQL Select where 多个 OR 语句

mysql - SQL 计数限制结果

sql - 调试 PostgreSQL sql 查询