5

次のようなダミーデータが設定された単純なテーブルがあります。

|id|user|value|
---------------
 1  John   2
 2  Ted    1
 3  John   4
 4  Ted    2

次の sql(MSSQL 2008) ステートメントを実行することで、累計を選択できます。

SELECT a.id, a.user, a.value, SUM(b.value) AS total
FROM table a INNER JOIN table b
ON a.id >= b.id
AND a.user = b.user
GROUP BY a.id, a.user, a.value
ORDER BY a.id

これにより、次のような結果が得られます。

|id|user|value|total|
---------------------
 1  John   2     2
 3  John   4     6
 2  Ted    1     1
 4  Ted    2     3

各ユーザーの最新の行のみを取得することは可能ですか? したがって、結果は次のようになります。

|id|user|value|total|
---------------------
 3  John   4     6
 4  Ted    2     3

私はこれを正しい方法で行っていますか?提案や従うべき新しい道は素晴らしいでしょう!

4

5 に答える 5

9

結合は必要ありません。次の方法でクエリを高速化できます。

select id, [user], value, total
from
(
  select id, [user], value, 
  row_number() over (partition by [user] order by id desc) rn, 
  sum(value) over (partition by [user]) total
from users
) a
where rn = 1
于 2012-08-16T08:51:24.220 に答える
5

これを試して:

;with cte as 
     (SELECT a.id, a.[user], a.value, SUM(b.value) AS total
    FROM users a INNER JOIN users b
    ON a.id >= b.id
    AND a.[user] = b.[user]
    GROUP BY a.id, a.[user], a.value
     ),
cte1 as (select *,ROW_NUMBER() over (partition by [user] 
                         order by total desc) as row_num
         from cte)
select  id,[user],value,total from cte1 where row_num=1

SQL フィドルのデモ

于 2012-08-16T07:19:24.350 に答える
1

where ステートメントを追加します。

select * from
(
your select statement
) t

where t.id in (select max(id) from table group by user)

また、次のクエリを使用できます。

SELECT a.id, a.user, a.value, 

(select max(b.value) from table b where b.user=a.user) AS total

FROM table a 

where a.id in (select max(id) from table group by user)

ORDER BY a.id
于 2012-08-16T06:49:19.320 に答える
0

右結合を追加すると、ネストされた選択よりもパフォーマンスが向上します。

またはさらに簡単です:

SELECT MAX(id), [user], MAX(value), SUM(value)
FROM table
GROUP BY [user]
于 2012-08-16T06:55:55.343 に答える