Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择每个组的上次更改值_Sql_Sql Server_Greatest N Per Group - Fatal编程技术网

Sql 选择每个组的上次更改值

Sql 选择每个组的上次更改值,sql,sql-server,greatest-n-per-group,Sql,Sql Server,Greatest N Per Group,我正在尝试选择每个组的最后更改值 我有一张桌子 MMID列是增量的 在这里,我想要8月18日最后24小时内的最后一次更改“值”。 从下面的查询中,我可以得到。但即使bundle的值发生了变化,我也会得到那一行。 但我只希望在“Value”更改或“Value和Bundle”更改时使用行。但不仅仅是当Bundle被改变时 Desired output MMID GID MID Value Bundle DateEntered 4 1 1 0 2

我正在尝试选择每个组的最后更改值

我有一张桌子

MMID列是增量的

在这里,我想要8月18日最后24小时内的最后一次更改“值”。 从下面的查询中,我可以得到。但即使bundle的值发生了变化,我也会得到那一行。 但我只希望在“Value”更改或“Value和Bundle”更改时使用行。但不仅仅是当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' ;
我不应该排在最后一排


有人能告诉我我应该在这里做些什么吗。

并没有真正按照您的尝试逻辑进行,但以下是我将如何获得所需结果:

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列,请使用列列表而不是选择*

为什么您的查询引用表1和表2?有不止一张桌子吗?看起来你的查询根本不应该起作用。有yt1.MMIDMMID 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
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
)