Величайшая отметка времени в группе - PullRequest
1 голос
/ 10 мая 2019

У меня есть довольно простая таблица с именем assignment;

CREATE TABLE IF NOT EXISTS assignment (h_id bigint, country string, p_name string)

Существует одна строка на h_id:

INSERT INTO TABLE assignment
  VALUES (19874, "France", "Example_Name"), 
         (21548, "France", "Example_Name"),
         (34569, "Germany", "Different_Name"),
         (47337, "Greece", "Another Name"),
         (54682, "Greece", "Example Name")
         (64963, "France", "Different Name");

Я хочу присоединиться assignment квторая таблица, state:

CREATE TABLE IF NOT EXISTS state (id bigint, xml_id bigint, datetime_in string, datetime_out string)

xml_id - это ключ объединения с h_id, и в состоянии h_id имеется несколько строк.

INSERT INTO TABLE state
  VALUES (1, 19874, "2014-04-03 10:38:31.0", "2017-11-30 10:45:00.0"), 
         (2, 19874, "2014-02-05 10:21:33.0", "2019-02-02 10:30:35.0"),
         (3, 19874, "2019-02-26 14:34:17.0", null),
         (4, 54682, "2019-03-07 14:43:34.0", null),
         (5, 54682, "2019-02-25 10:47:09.0", null)
         (6, 64963, "2019-02-06 12:50:05.0", "2019-05-04 16:15:08.0");

Мой желаемыйвыводит данные из assignment с самой последней datetime_in из state.

Вот что я пробовал:

SELECT xml_id, datetime_in
    FROM (SELECT *,
        dense_rank() over (partition by xml_id ORDER BY datetime_in DESC) as rank
        FROM state s
        WHERE s.xml_id IN (SELECT a.h_id FROM assignment a)
    ) temp
    WHERE rank = 1

Проблема в том, что я получаю только ~2k строк назад, несмотря на то, что в присваивании было ~ 7k строк.

Если я сделаю:

SELECT COUNT(*) FROM state s
WHERE s.xml_id IN (SELECT a.h_id FROM assignment a)

, я получу ~ 8k результатов.Я ожидаю, что, поскольку в state на a.h_id есть несколько строк.Однако я не могу понять, почему я получаю ~ 2 тыс. Строк только при попытке получить самую последнюю datetime_in с данными из assignment.

1 Ответ

0 голосов
/ 10 мая 2019

Некоторые ключи из таблицы assignment не существуют в таблице state, похоже, в обеих таблицах есть только ключи 2K.

Проверьте также этот запрос, чтобы найти ключи, которые существуют только в назначении:

SELECT a.h_id 
  FROM assignment a 
       left join (select distinct s.xml_id from state s) s on  a.h_id =  s.xml_id
 WHERE s.xml_id is null;

Если таблица состояний может содержать много записей с одной и той же временной меткой, то параметр density_rank присвоит 1 всем записям с одной и той же временной меткой xml_id. Если вам нужна только одна запись, используйте row_number(). Если вам нужны все записи из присвоения, даже если соответствующие записи не существуют в таблице состояний, используйте left join. Замените left join на inner join, если вам нужны только ключи, существующие в обеих таблицах:

select a.*, s.*
  from assignment a
       left join (SELECT s.*,
                        row_number() over (partition by xml_id ORDER BY datetime_in DESC) as rn
                   FROM state s
                 ) s on s.xml_id = a.h_id and s.rn=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...