Как удалить, чтобы отличить некоторые ключи в SQL - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть данные в базе данных, в которой есть ключи key1, key2, date.

Я хочу найти записи, которые не различаются по key1, key2 (я имею в виду уникальный композит), и сделать его уникальным композитом, удалив, чтобы оставить самую старую запись по столбцу date.

Какой самый простой запрос для этого? Я использую стандартный запрос BigQuery, но любая СУБД в порядке.

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

В MySQL вы можете использовать сочетание групп по ключам, чтобы получить список элементов для хранения в базе данных, а затем удалить остальные элементы.

DELETE table.* from table,
(
select DISTINCT MIN(date) mindate, key1, key2
FROM table
GROUP BY key1, key2
) tmp
WHERE table.key1 = tmp.key1 and table.key2 = tmp.key2
and table.date <> tmp.mindate

Это SqlFiddle для отображения значенийсобирается быть удаленным (он использовал SELECT вместо DELETE)

http://sqlfiddle.com/#!9/9d774f/1

0 голосов
/ 13 сентября 2018

Я не рекомендую вам удалять записи.Это обычно не очень хорошая идея в BigQuery.Я, по крайней мере, хотел бы сохранить историю.

Я бы начал с представления:

create view v_t as 
    select t.* except (seqnum)
    from (select t.*,
                 row_number() over (partition by key1, key2 order by date desc) as seqnum
          from t
         ) t
    where seqnum = 1;

Если вы пытаетесь сэкономить на последующих запросах, то вы можете материализовать представление(т.е. храните его в таблице) по мере необходимости.

0 голосов
/ 13 сентября 2018

Это дает самый старый ряд в соответствии с date:

SELECT
  key1,
  key2,
  ARRAY_AGG(
    (SELECT AS STRUCT t.* EXCEPT key1, key)
    ORDER BY date DESC LIMIT 1
  )[OFFSET(0)].*
FROM dataset.table AS t
GROUP BY key1, key2

Функция ARRAY_AGG использует предложение ORDER BY для поиска самой старой строки (обозначается t), а затем расширяет ее с помощью .*, примененного к оператору скобок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...