没有自联接的最新sql行实例

时间:2016-04-01 20:33:01

标签: sql sql-server

输入行

userid        |  no      |  version_no
--------------|----------|--------------  
abc           | 100      | 1  
abc           | 2        | 1  
abc           | 101      | 2  
abc           | 3        | 2
def           | 9        | 1
def           | 1        | 2
def           | 6        | 3
def           | 8        | 4

我希望查询的输出为:

abc      |  104       |  2
def      |  8         |  4

我可以使用除自连接之外的任何方法吗?我正在使用sql server。 abc-104的输出no是输入中101和3的总和。如果我有最新版本的多行,我只想显示no的总和。

多次编辑帖子的道歉。

4 个答案:

答案 0 :(得分:2)

您需要在汇总后应用排名函数:

SELECT *
FROM
 ( SELECT userid, SUM(no) AS no_sum, version_no,
      ROW_NUMBER()
      OVER (PARTITION BY userid 
            ORDER BY version_no DESC) AS rn
   FROM table_name
   GROUP BY userid, version_no
 ) AS dt
WHERE rn = 1

答案 1 :(得分:1)

编辑以反映对问题的修改:

要限制到最新版本,请添加HAVING子句,其作用方式与WHERE子句类似,但过滤由GROUP BY汇总的列:

SELECT userid, SUM(no) AS no_sum, version_no
FROM table_name
GROUP BY userid, version_no
HAVING version_no=MAX(version_no)

答案 2 :(得分:1)

要在没有自我加入的情况下获得最高版本_no的汇总结果,您可以使用TOPORDER BY

SELECT TOP 1
     userid,
     sum(no),
     version_no
FROM your_table
GROUP BY userid, version_no
ORDER BY version_no DESC

TOP 1将仅按ORDER BY version_no子句的顺序返回结果集中的第一条记录。

答案 3 :(得分:1)

使用必须选择版本最高的行_no

SELECT userid, SUM(no) 
FROM table_name t1
having version_no = (select max(version_no) from  table_name  t2 WHERE t1.user_id = t2.user_id)
GROUP BY userid, version_no