如何轻松获取所有密钥的最新版本数据?
How to easily get most recent version of data for all keys?
我正在尝试创建一些具有以下特征的 table:
- 存储特定键的所有数据版本
- 能够轻松获取所有键的最新版本数据
我的架构如下:
CREATE TABLE WebSitesStatus(
-- Host name of the site in question.
Host String(40) NOT NULL,
-- When the information on the site was last updated.
UpdateDate Date NOT NULL,
HttpsWorks BOOL NOT NULL,
ModernTls BOOL NOT NULL,
) PRIMARY KEY(Host, UpdateDate DESC);
因此 table 的示例子集可能是:
+--------------+------------+------------+-----------+
| Host | UpdateDate | HttpsWorks | ModernTls |
+--------------+------------+------------+-----------+
| foobar.com | 2016-10-14 | true | false |
| google.com | 2016-10-14 | true | true |
| google.com | 2016-04-23 | false | false |
| nytimes.com | 2016-10-14 | false | false |
| nytimes.com | 2016-05-25 | true | true |
| nytimes.com | 2016-04-25 | true | false |
| nytimes.com | 2016-04-23 | true | false |
| paypal.com | 2016-10-14 | true | false |
+--------------+------------+------------+-----------+
我想找个办法回去
+--------------+------------+------------+-----------+
| Host | UpdateDate | HttpsWorks | ModernTls |
+--------------+------------+------------+-----------+
| foobar.com | 2016-10-14 | true | false |
| google.com | 2016-10-14 | true | true |
| nytimes.com | 2016-10-14 | false | false |
| paypal.com | 2016-10-14 | true | false |
+--------------+------------+------------+-----------+
但是结构不允许我轻松地做到这一点。有没有办法轻松完成此查询?
这个查询:
SELECT t.Host, MAX(t.UpdateDate) AS UpdateDate
FROM WebSitesStatus AS t
GROUP BY t.Host
returns 只是你想要的行的主键:
+--------------+------------+
| Host | UpdateDate |
+--------------+------------+
| foobar.com | 2016-10-14 |
| google.com | 2016-10-14 |
| nytimes.com | 2016-10-14 |
| paypal.com | 2016-10-14 |
+--------------+------------+
要获得其他列,您必须 JOIN
这回到相同的 table,像这样:
SELECT p.Host, p.UpdateDate, q.HttpsWorks, q.ModernTls,
FROM (SELECT t.Host, MAX(t.UpdateDate) AS UpdateDate
FROM WebSitesStatus AS t
GROUP BY t.Host) AS p
JOIN WebSitesStatus AS q
ON p.Host = q.Host AND p.UpdateDate = q.UpdateDate;
这会产生您想要的数据:
+--------------+------------+------------+-----------+
| Host | UpdateDate | HttpsWorks | ModernTls
+--------------+------------+------------+-----------+
| amazon.co.uk | 2016-10-14 | true | false |
| amazon.com | 2016-10-14 | true | true |
| nytimes.com | 2016-10-14 | false | false |
| paypal.com | 2016-10-14 | true | false |
+--------------+------------+------------+-----------+
这有点低效,因为它会扫描您的 table 两次:一次获取主键值,然后再次获取所有其他值。但这可能是最干净的方法。
我正在尝试创建一些具有以下特征的 table:
- 存储特定键的所有数据版本
- 能够轻松获取所有键的最新版本数据
我的架构如下:
CREATE TABLE WebSitesStatus(
-- Host name of the site in question.
Host String(40) NOT NULL,
-- When the information on the site was last updated.
UpdateDate Date NOT NULL,
HttpsWorks BOOL NOT NULL,
ModernTls BOOL NOT NULL,
) PRIMARY KEY(Host, UpdateDate DESC);
因此 table 的示例子集可能是:
+--------------+------------+------------+-----------+
| Host | UpdateDate | HttpsWorks | ModernTls |
+--------------+------------+------------+-----------+
| foobar.com | 2016-10-14 | true | false |
| google.com | 2016-10-14 | true | true |
| google.com | 2016-04-23 | false | false |
| nytimes.com | 2016-10-14 | false | false |
| nytimes.com | 2016-05-25 | true | true |
| nytimes.com | 2016-04-25 | true | false |
| nytimes.com | 2016-04-23 | true | false |
| paypal.com | 2016-10-14 | true | false |
+--------------+------------+------------+-----------+
我想找个办法回去
+--------------+------------+------------+-----------+
| Host | UpdateDate | HttpsWorks | ModernTls |
+--------------+------------+------------+-----------+
| foobar.com | 2016-10-14 | true | false |
| google.com | 2016-10-14 | true | true |
| nytimes.com | 2016-10-14 | false | false |
| paypal.com | 2016-10-14 | true | false |
+--------------+------------+------------+-----------+
但是结构不允许我轻松地做到这一点。有没有办法轻松完成此查询?
这个查询:
SELECT t.Host, MAX(t.UpdateDate) AS UpdateDate
FROM WebSitesStatus AS t
GROUP BY t.Host
returns 只是你想要的行的主键:
+--------------+------------+
| Host | UpdateDate |
+--------------+------------+
| foobar.com | 2016-10-14 |
| google.com | 2016-10-14 |
| nytimes.com | 2016-10-14 |
| paypal.com | 2016-10-14 |
+--------------+------------+
要获得其他列,您必须 JOIN
这回到相同的 table,像这样:
SELECT p.Host, p.UpdateDate, q.HttpsWorks, q.ModernTls,
FROM (SELECT t.Host, MAX(t.UpdateDate) AS UpdateDate
FROM WebSitesStatus AS t
GROUP BY t.Host) AS p
JOIN WebSitesStatus AS q
ON p.Host = q.Host AND p.UpdateDate = q.UpdateDate;
这会产生您想要的数据:
+--------------+------------+------------+-----------+
| Host | UpdateDate | HttpsWorks | ModernTls
+--------------+------------+------------+-----------+
| amazon.co.uk | 2016-10-14 | true | false |
| amazon.com | 2016-10-14 | true | true |
| nytimes.com | 2016-10-14 | false | false |
| paypal.com | 2016-10-14 | true | false |
+--------------+------------+------------+-----------+
这有点低效,因为它会扫描您的 table 两次:一次获取主键值,然后再次获取所有其他值。但这可能是最干净的方法。