Мне нужен уникальный набор данных из моей таблицы с использованием SQL - PullRequest
1 голос
/ 23 июля 2010

Я работаю с таблицей Dbase с помощью команд SQL. У меня есть следующая бесплатная таблица для работы.

Import1

учетная запись, телефон, субсчет, locationid

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

Можно ли это сделать? Спасибо

Редактировать. Я обнаружил, что для квалификации выбранные записи должны оставаться нетронутыми.

Пример:

Import1

001 123-4567 123 0110

001 123-0001 234 0220

001 123-4567 456 0011

002 222-2222 010 0110

003 333-3333 333 0330

должен вернуть

Import1

001 123-4567 123 0110

001 123-0001 234 0220

002 222-2222 010 0110

003 333-3333 333 0330

Это мое намерение здесь.

Ответы [ 5 ]

1 голос
/ 23 июля 2010

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

Select T1.account, T1.phone, T1.subaccount, T1.locationId....
From "Table" As T1
Where (Cast(T1.UniqueCol1 As varchar(100)) 
    + "|" + Cast(T2.UniqueCol2 As varchar(100)
    ... ) = (
            Select Min( Cast(T2.UniqueCol1 As varchar(100))
                        + "|" + Cast(T2.UniqueCol2 As varchar(100))
                        ... 
                        ) 
            From "Table" As T2
            Where T2.account = T1.account
                And T2.phone = T1.phone
            )

В этом случае UniqueCol1 представляет один из столбцов уникального ключа, UniqueCol2 представляет следующий и т. Д. Это не будет быстрый запрос с помощью любых средств. Наличие единственного столбца, гарантирующего уникальность, значительно упростит эту проблему. С этим вы можете сделать что-то похожее на решение Майка М:

Select T1.account, T1.phone, T1.subaccount, T1.locationId....
From "Table" As T1
Where UniqueCol = (
                    Select Min( T2.UniqueCol ) 
                    From "Table" As T2
                    Where T2.account = T1.account
                        And T2.phone = T1.phone
                    )

Важным моментом, который следует здесь подчеркнуть, является то, что в обоих решениях выше «первое» определяется просто наименьшим из найденных значений отсортированного ключа. Если «first» нужно определить по чему-то другому, например, по столбцу datetime, вы должны указать это в своем сообщении.

EDIT

Учитывая ваше добавление, что это импорт, самое простое решение - добавить автоматически увеличивающийся столбец в вашу промежуточную таблицу. В SQL Server это будет столбец IDENTITY, но другие продукты баз данных имеют аналог. Если вы сделаете это, то последнее решение, которое я представил выше, поможет (просто замените UniqueCol на имя вашего столбца Identity).

0 голосов
/ 23 июля 2010
select account, min(phone), min(subaccount), min(locationid) 
from import1 
group by account, phone 

кажется лучшим решением для моей IDE (Visual Fox Pro v9)

0 голосов
/ 23 июля 2010

Чуть более элегантное решение:

SELECT account, phone, subaccount, locationid
FROM import1
WHERE account IN
(SELECT DISTINCT account, phone FROM import1)
0 голосов
/ 23 июля 2010

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

Если я вас правильно понимаю, вы можете создать новые таблицы или представления в следующем формате:

import1
-------
id  |Phone  | Account

SubAccount  //SubAccountId may not be needed here...
----------
SubAccountId  |ImportId  | SubAccount

ImportLocation
--------------
ImportId |LocationId

Дайте мне знать, если я не понял, что вы пытаетесь сделать ...

UPDATE:

Эта измененная версия вашего предложения должна работать. Только взял Минутку с телефона и добавил отчетливый:

Select distinct account, 
       phone, 
       min(subaccount), 
       min(locationid) 
from  import1 
group by account, phone
0 голосов
/ 23 июля 2010

Попробуйте следующее:

SELECT *, ROW_NUMBER() OVER (Order By account) AS Id
INTO #Table FROM import1

Теперь у вас есть первичный ключ-

    SELECT account, phone, MAX(Id) AS Id
    FROM #Table
    GROUP BY account, phone

РЕДАКТИРОВАТЬ: я забыл важную часть. DOH.

SELECT * FROM #Table T
WHERE T.Id IN (
        SELECT MAX(Id) AS Id
        FROM #Table
        GROUP BY account, phone )
...