Как получить уникальные значения в столбце, но добавить больше столбцов в мой запрос

#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 записей.