我想从OWNERKEY
为1的数据库中检索所有行,但只检索DATAVERSION
中DATACONTROLID
的最高{。}}。
在下面的例子中,我有两行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
吗?
答案 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 = 1
有DATAVERSION = 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简介,掌握关系数据库语言”中学到了这一点。很容易阅读。