#sql #ms-access
#sql #ms-access
Вопрос:
У меня есть таблица с телефонными номерами и несколькими пакетами, которым они принадлежат. Некоторые числа принадлежат одному пакету, а некоторые другие — нескольким пакетам. Пакеты сортируются по возрастанию.
Мне нужно получить новую таблицу с номерами и только первый (самый старый) пакет.
Если я использую это:
SELECT DISTINCT Cli_Inyectados.Telefono, Cli_Inyectados.Paquete INTO New_Table
FROM Cli_Inyectados;
Я получу ту же таблицу, потому что в ней нет повторяющихся записей.
Если я использую GROUP BY
или DISTINCTROW
получаю тот же результат.
Комментарии:
1. Пожалуйста, предоставьте образцы данных и желаемые результаты. Как вы узнаете, какая строка самая старая?
2. Номера пакетов состоят из двухзначного возрастающего числа, года и номера недели. Пример: телефонные номера Telefono 134583020 Paquete 39-20.w01 хранятся несколько раз, как и пакеты, но одна и та же комбинация — нет.
Ответ №1:
Избегайте коррелированного подзапроса, если не вычислять текущие агрегированные данные. Вместо этого рассмотрите возможность присоединения к совокупному подзапросу:
SELECT i.Telefono, i.Paquete
INTO New_Table
FROM Cli_Inyectados i
INNER JOIN
(SELECT Telefono
, MIN(Paquete) AS min_Paquete
FROM Cli_Inyectados
GROUP BY Telefono
) agg
ON i.Telefono = agg.Telefono
AND i.Paquete = agg.min_Paquete
Ответ №2:
Используйте коррелированный подзапрос. Предполагая, что у вас есть какой-то столбец с меткой времени, который произвольно вызывается created_at
в приведенном ниже запросе:
SELECT i.Telefono, i.Paquete
INTO New_Table
FROM Cli_Inyectados as i
WHERE i.created_at = (SELECT MIN(i2.created_at)
FROM Cli_Inyectados as i2
WHERE i2.Telefono = i.Telefono
);
Комментарии:
1. @yogurblanco . , , Конечно. В противном случае я бы не предоставил ответ.
Ответ №3:
Я думаю, что понимаю, что вы сказали, но на самом деле у меня не больше полей, чем Telefono (номер) и Paquete (короткий текст). Итак, я попробовал использовать этот код после проверки того, что MIN для поля Paquete возвращает наименьшее значение.
SELECT i.Telefono, i.Paquete
INTO New_Table
FROM Cli_Inyectados as i
WHERE i.Paquete = (SELECT MIN(i2.Paquete)
FROM Cli_Inyectados as i2
WHERE i2.Telefono = i.Telefono
);
Но это занимает много времени, поэтому я думаю, что делаю это неправильно.
Текущая таблица Cli_Inyectados содержит более 17 000 записей, но только 3020 разных телефонных номеров, поэтому в моей New_table должно быть 3020 записей.