2017-02-17 4 views
0

Я пытаюсь создать несколько таблиц со следующими характеристиками:Как легко получить самую последнюю версию данных для всех ключей?

  • Сохраняет все версии данных для конкретной ключевой
  • Способен легко получить самые последние версии данных для всех ключей

Моя схема выглядит следующим образом:

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); 

так пример подмножество таблицы может быть:

+--------------+------------+------------+-----------+ 
| 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  | 
+--------------+------------+------------+-----------+ 

но структура не позволяет мне легко это сделать. Есть ли способ сделать этот запрос легко?

ответ

0

Этот запрос:

SELECT t.Host, MAX(t.UpdateDate) AS UpdateDate 
FROM WebSitesStatus AS t 
GROUP BY t.Host 

возвращает только первичные ключи строк вы хотите:

+--------------+------------+ 
| Host   | UpdateDate | 
+--------------+------------+ 
| foobar.com | 2016-10-14 | 
| google.com | 2016-10-14 | 
| nytimes.com | 2016-10-14 | 
| paypal.com | 2016-10-14 | 
+--------------+------------+ 

Чтобы получить другие столбцы, которые вы должны JOIN это обратно в ту же таблицу, как это:

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  | 
+--------------+------------+------------+-----------+ 

Это несколько неэффективен, так как он сканирует таблицу дважды: один раз, чтобы получить значения первичного ключа, а затем еще раз, чтобы извлечь все остальные значения. Но это, наверное, самый чистый подход.

Смежные вопросы