输入行
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的总和。
多次编辑帖子的道歉。
答案 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的汇总结果,您可以使用TOP
和ORDER 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