选择所有行,但只选择数据库中的最新(最高)版本

时间:2015-11-24 17:07:30

标签: sql pervasive-sql

我想从OWNERKEY为1的数据库中检索所有行,但只检索DATAVERSIONDATACONTROLID的最高{。}}。

在下面的例子中,我有两行DATACONTROLID = 1,他们有1和2 DATAVERSION。我想获得最高分。

MYDB:

DATAKEY       OWNERKEY       OWNERTYPE      DATAVERSION   MALLKEY       DATAVALUE    DATAVALUETYPE   DATACONTROLID   DATADATE     DATATIME      DATASIGN
===========   ============   ===========   ===========   ===========   =========    ============    =============   ==========   ===========   =========     
4              1             2             1             1             1             2                1             2015-11-24   09:55:00:00   ADMIN
3              1             2             2             1             2             2                1             2015-11-23   20:55:00:00   ADMIN
2              1             2             1             1             3             2                2             2015-11-23   15:39:00:00   ADMIN
1              1             2             1             1             4             2                3             2015-11-23   11:29:00:00   ADMIN

通缉结果:

DATAKEY       OWNERKEY       OWNERTYPE      DATAVERSION   MALLKEY       DATAVALUE    DATAVALUETYPE   DATACONTROLID   DATADATE     DATATIME      DATASIGN
===========   ============   ===========   ===========   ===========   =========    ============    =============   ==========   ===========   =========     
3              1             2             2             1             2             2                1             2015-11-23   20:55:00:00   ADMIN
2              1             2             1             1             3             2                2             2015-11-23   15:39:00:00   ADMIN
1              1             2             1             1             4             2                3             2015-11-23   11:29:00:00   ADMIN

我从哪里开始?

SELECT *
FROM MyDB
WHERE OWNERKEY = 1

上面的陈述是obviuos部分,但我该如何继续?

我想我应该以某种方式使用MAX(DATAVERSION),但要分组的是什么?我可以同时使用*MAX吗?

3 个答案:

答案 0 :(得分:2)

试试这个:

SELECT *
  FROM (SELECT OWNERKEY,DATACONTROLID,DATAVERSION,
               rank() over (partition by DATACONTROLID order by DATAVERSION desc) rnk
          FROM MyDB WHERE OWNERKEY = 1)
 WHERE rnk = 1;

注意:我没有测试过,但这应该可行

答案 1 :(得分:2)

以下是GROUP BY中使用MSSQL的简单示例:

SELECT  DATACONTROLID, 
        MAX(DATAVERSION) AS DATAVERSION, -- Note that 'AS' just gives the column a name in the result set, this isn't required.
        OWNERKEY
FROM    MyDB
WHERE   OWNERKEY = 1
GROUP BY DATACONTROLID, OWNERKEY

这假设DATACONTROLID确定了' distinct'记录和DATAVERSION是记录的实例。

这会将DATACONTROLID列分组并返回分组结果的MAX(DATAVERSION)。在这种情况下,DATACONTROLID = 1DATAVERSION = 1 and 2,因此返回2.

值得注意的是,如果您希望在结果中看到其他列,并且它们不是MAX() 之类的聚合,那么您就可以了需要将它们添加到GROUP BY子句中 - 就像我在OWNERKEY列中所做的那样。如果您在SELECT OWNERKEY中没有使用GROUP BY而尝试JOIN,则会收到错误消息。

编辑:

以下是使用SELECT * FROM MyDB mdb INNER JOIN ( SELECT MAX(DATAVERSION) AS DATAVERSION, DATACONTROLID FROM MyDB WHERE OWNERKEY = 1 GROUP BY DATACONTROLID ) AS mdb2 ON mdb2.DATACONTROLID = mdb.DATACONTROLID AND mdb2.DATAVERSION = mdb.DATAVERSION 完成相同结果的更好方法:

GROUP BY

这样做会将我之前展示的相同INNER JOIN语句转换为过滤表。 MAX(DATAVERSION)部分正在选择DATACONTROLID及其所属的mdb2,并将结果作为临时表DATAVERSION DATACONTROLID 2 1 1 2 1 3 返回。

这个新的内部表将返回以下内容:

(SELECT *)

然后我们将获取该结果并获取符合此条件的所有行DATAVERSION = 1 where DATACONTROLID = 1。由于此内部表格不包含LEFT OUTER JOIN的结果,因此此行会被过滤掉。

相反,如果您只想查看旧版版本而不是最新版本,则可以将此条件更改为WHERE mdb2.DATAVERSION IS NULL并添加SELECT * FROM MyDB mdb LEFT OUTER JOIN ( SELECT MAX(DATAVERSION) AS DATAVERSION, DATACONTROLID FROM MyDB WHERE OWNERKEY = 1 GROUP BY DATACONTROLID ) AS mdb2 ON mdb2.DATACONTROLID = mdb.DATACONTROLID AND mdb2.DATAVERSION = mdb.DATAVERSION WHERE mdb2.DATAVERSION IS NULL

MAX(DATAVERSION)

由于我们在mdb2中选择了$(function(){ addTags(); function addTags(){ $('.parahead').each(function (){ var id = parseInt($(this).text()); console.log(id); $(this).after("<span name='parahead" + id +"'></span>"); }); } }); ,因此对于不符合此条件的行,它将包含null。

答案 2 :(得分:0)

怎么样

SELECT *
FROM MyDB
WHERE OWNERKEY = 1
and   DATAVERSION = 
      (SELECT max(DATAVERSION)
      FROM MyDB
      WHERE OWNERKEY = 1)

适用于某些数据库环境;我希望你的!我从Rick F. van der Lans的“SQL简介,掌握关系数据库语言”中学到了这一点。很容易阅读。