在昨天有一个问题,不幸的是我没有给自己解释得很好 - 其中一个结束了一天的事情。
无论如何,我有一张叫做文件的桌子......
+----+--------------------------------------+-----------+---------+---------+
| id | document_guid | title | version | payload |
+----+--------------------------------------+-----------+---------+---------+
| 1 | 0D2753BE-583B-42CE-B0DA-1FD0171D95C0 | animation | 1 | {} |
| 2 | 0D2753BE-583B-42CE-B0DA-1FD0171D95C0 | animation | 2 | {} |
| 3 | 1C2A1131-0261-4D58-81AA-EFAB5285B282 | formation | 1 | {} |
| 4 | 1E17403F-C590-4CE4-9E79-E1B7C98F97F1 | session | 1 | {} |
| 4 | 1E17403F-C590-4CE4-9E79-E1B7C98F97F1 | session | 2 | {} |
+----+--------------------------------------+-----------+---------+---------+
如您所见,我们可以拥有同一文档的多个版本(由document_guid引用)。我需要的是表中所有文件的计数,不包括过时的版本。即如果文件1E17403F-C590-4CE4-9E79-E1B7C98F97F1有两个版本,就像它在上面的例子中所示,那么它应该只占整个计数中的一个文件。
我真的希望这比我的上一个问题更有意义。
我遇到的主要问题是我需要一个类似的查询来返回所有最新版本,而不仅仅是计数。
答案 0 :(得分:2)
计算不同的document_guids:
select count(distinct document_guid) from documents
要返回每个文档的最新版本,您可以执行GROUP BY
(作为user2864740'答案)或NOT EXISTS
:
select * from documents d1
where not exists (select 1 from documents d2
where d2.document_guid = d1.document_guid
and d2.version > d1.version)
即。如果没有其他具有相同document_guid的版本号更高,则返回一行。
答案 1 :(得分:2)
有用的查询可能如下所示:
-- select the maximum version (and other information, per group)
-- can also add a 'count(1) as version_count' if required
select max(version) as latest_version, title, document_guid
from documents
-- from each group, as divided up by the same guid *see note 1
group by document_guid, title
此查询返回最新版本号;总有"一个最新版本"每份文件。
1 标题可能是规范化的中断,需要成为该组的一部分,以便将其包含在结果列中;如果不需要,可以将其删除。
如果标题是可以更改版本的必填字段,那么这需要以不同的方式编写 - 首先找到"最新版本"然后将其与适当的行连接起来。一个例子:
select t.latest_version, d.title, d.document_guid
from documents d
join (
select max(version) as latest_version, document_guid
from documents
group by document_guid
) t
on t.document_guid = d.document_guid and t.latest_version = d.version
当然,这假定了(document_guid, version)
的关键字。