选择每组的上次更改值

时间:2015-08-19 17:58:36

标签: sql sql-server greatest-n-per-group

我正在尝试为每个组选择最后一个更改值。

我有一张桌子

MMID列是增量

MMID  GID  MID  Value  Bundle DateEntered
1      1    1      1     2       17/8/15 05:05:04
2      1    2      2     3       16/8/15 05:05:06
3      1    3      3     2       15/8/15 05:05:07
4      1    1      0     2       18/8/15 05:05:08
5      2    2      1     1       18/8/15 05:05:05
6      2    2      2     2       18/8/15 06:06:06
7      2    4      3     1       17/8/15 06:06:06
8      2    4      3     2       18/8/15 06:06:07

在这里,我想要最后一次改变'价值'在过去的24小时内(8月18日)。 从下面的查询中,我可以得到它。但即使更改了bundle值,我也会得到那一行。 但是,我只想在“价值”时使用行。被改变,或者“价值和捆绑”#39;改变了。但不仅当Bundle被改变时

Desired output

MMID  GID  MID  Value  Bundle DateEntered

4      1    1      0     2       18/8/15 05:05:08
6      2    2      2     2       18/8/15 06:06:06

我试过的查询是:

select yt1.*
from Table1 yt1
left outer join Table1 yt2
on (yt1.GID = yt2.GID and yt1.MID = yt2.MID
and yt1.MMID < yt2.MMID)
where yt2.MMID is null and yt2.GID is null and yt2.MID is null and yt1.DateEntered > '2015-08-18 00:00:00' ;

我从这里得到的输出是:

MMID  GID  MID  Value  Bundle DateEntered

4      1    1      0     2       18/8/15 05:05:08
6      2    2      2     2       18/8/15 06:06:06
8      2    4      3     2       18/8/15 06:06:07

我不应该在这里得到最后一行。

任何人都可以告诉我这里应该改变什么。

1 个答案:

答案 0 :(得分:0)

不是真的遵循你的尝试逻辑,但这是我将如何得到预期的结果:

WITH cte AS (
  SELECT *, 
    ROW_NUMBER() OVER (PARTITION BY GID, MID ORDER BY MMID) AS rn
  FROM Table
)
, cte2 AS (
SELECT t1.* FROM cte t1
INNER JOIN cte t2
 ON t1.GID=t2.GID
 AND t1.MID=t2.MID
 AND t1.value<>t2.value
 AND t1.rn=t2.rn+1
)
SELECT * 
FROM cte2
WHERE MMID=(
  SELECT TOP 1 MMID
  FROM cte2 c2
  WHERE cte2.GID=c2.GID
  AND cte2.MID=c2.MID
  ORDER BY MMID DESC
)

注意:如果您不想在最终结果中包含rn列,请使用列列表而不是SELECT *。