Rafał S.

Rafał S. System Administrator

Temat: Duplikujące się wartości w jednej kolumnie a wszystkie...

Witam mam w bazie danych tabelkę z 200 tys rekordów gdzie jedna kolumna "telefon" ma powtarzające się numery telefonów przy czym reszta danych w danym rekordzie jest całkiem inna. Potrzebuje wybrać selectem wszystkie dane ale tak żeby rekord który ma ten sam numer telefonu został wybrany tylko jeden raz. Kiedy wybiorę Distinct( telefon) wybiera mi 110 tys unikalnych telefonów. Ale ja potrzebuje resztę danych po Distinctowym telefonie ...

Zilustruję to na małym przykładzie

Mam tabelkę Klient

Obrazek


Zależy mi na takim select który wybierze wszystkie rekordy z tej tabeli po DISTINCTowym telefonie. Więc chciałbym otrzymać taki oto rezultat. (Nie ma dla mnie znaczenia który rekord z powtarzającym się telefonem zostanie wybrany)


Obrazek


tylko nie piszcie prosze

SELECT Imie,Nazwisko,Adres,Numer Mieszkania,DISTINCT(Telefon) FROM Klient

bo moj prawdziwy problem ma 45 kolumn :O

ps nie ja projektowałem baze ;p

ps2 w kwestii wyjaśnienia zeby sie nikt nie czepiał - powiedzmy ze osoby z tym samym kolorem używaja jednego telefonu ;p

ps3 PROBLEM DOTYCZY PostgreSQLRafał S. edytował(a) ten post dnia 11.06.09 o godzinie 17:53
Łukasz B.

Łukasz B. programista PL/SQL

Temat: Duplikujące się wartości w jednej kolumnie a wszystkie...

Nie znam PostgreSQL, ale jeśli dobrze rozumiem dokumentacje rozwiązaniem Twojego problemu jest klauzula DISTINCT ON

http://www.postgresql.org/docs/8.0/interactive/queries...
Przemysław Krygier

Przemysław Krygier Specjalista Systemów
Informatycznych

Temat: Duplikujące się wartości w jednej kolumnie a wszystkie...

Rafale odpowiedź może być nieprecyzyjna bo:
1. Nie jestem fanem PostgreSQL.
2. Kawałek przedstawionej tabeli nie zawiera klucza głównego.
3. Twoje zapytanie wydaje się być cokolwiek dziwne:
a) ze swej natury - po co pytać bazę o 110000 rekordów ?
b) numery telefonów zdają się być unikatowe :) ...

ale do rzeczy, w T-SQL

dla tabeli o strukturze

CREATE TABLE [dbo].[klienci](
[nazwisko] [varchar](50) COLLATE Polish_CI_AS NOT NULL,
[imie] [varchar](50) COLLATE Polish_CI_AS NOT NULL,
[telefon] [varchar](50) COLLATE Polish_CI_AS NOT NULL
) ON [PRIMARY]


można by to osiągnąć poprzez podzapytania (tyle podzapytań ile kolumn chcesz wydobyć):


SELECT t.telefon,
(SELECT TOP(1) imie FROM klienci k WHERE k.telefon = t.telefon) as imie,
(SELECT TOP(1) nazwisko FROM klienci k WHERE k.telefon = t.telefon) as nazwisko
FROM
(SELECT DISTINCT telefon FROM klienci ) as t

Irek Słonina

Irek Słonina programowanie, bazy
danych i linuksy

Temat: Duplikujące się wartości w jednej kolumnie a wszystkie...

Zakładam, że jest PK na unikatowym polu "id".

SELECT * FROM klient WHERE id IN (SELECT max(id) FROM klient GROUP BY telefon)
Łukasz B.

Łukasz B. programista PL/SQL

Temat: Duplikujące się wartości w jednej kolumnie a wszystkie...

Sądzę, że sęk w tym, że ktoś kto projektował bazę chyba nie wpadł na pomysł, żeby uwzględnić PK... Smutne, ale prawdopodobnie prawdziwe.

konto usunięte

Temat: Duplikujące się wartości w jednej kolumnie a wszystkie...

Przemysław Krygier:
Rafale odpowiedź może być nieprecyzyjna bo:
b) numery telefonów zdają się być unikatowe :) ...

numery wracają do puli jak klient rozwiąże umowę
numer można przepisać na kogoś innego -> cesja
ale do rzeczy, w T-SQL

dla tabeli o strukturze

CREATE TABLE [dbo].[klienci](
[nazwisko] [varchar](50) COLLATE Polish_CI_AS NOT NULL,
[imie] [varchar](50) COLLATE Polish_CI_AS NOT NULL,
[telefon] [varchar](50) COLLATE Polish_CI_AS NOT NULL
) ON [PRIMARY]


można by to osiągnąć poprzez podzapytania (tyle podzapytań ile kolumn chcesz wydobyć):


SELECT t.telefon,
(SELECT TOP(1) imie FROM klienci k WHERE k.telefon = t.telefon) as imie,
(SELECT TOP(1) nazwisko FROM klienci k WHERE k.telefon = t.telefon) as nazwisko
FROM
(SELECT DISTINCT telefon FROM klienci ) as t


SELECT * from (
SELECT [nazwisko]
,[imie]
,[telefon]
,DENSE_RANK() over (PARTITION BY [telefon] ORDER BY nAZWISKO) AS T
FROM [Aplikacja].[dbo].[klienci] ) AS r
WHERE r.T = 1


podzapytania nie są konieczne
Irek Słonina

Irek Słonina programowanie, bazy
danych i linuksy

Temat: Duplikujące się wartości w jednej kolumnie a wszystkie...

Łukasz Bednarek:
Sądzę, że sęk w tym, że ktoś kto projektował bazę chyba nie wpadł na pomysł, żeby uwzględnić PK... Smutne, ale prawdopodobnie prawdziwe.

Najwyższy czas naprawić błąd projektanta ;-)
Przemysław Krygier

Przemysław Krygier Specjalista Systemów
Informatycznych

Temat: Duplikujące się wartości w jednej kolumnie a wszystkie...

Przemysław R.:
Przemysław Krygier:
Rafale odpowiedź może być nieprecyzyjna bo:
b) numery telefonów zdają się być unikatowe :) ...

numery wracają do puli jak klient rozwiąże umowę
numer można przepisać na kogoś innego -> cesja
ale do rzeczy, w T-SQL

dla tabeli o strukturze

CREATE TABLE [dbo].[klienci](
[nazwisko] [varchar](50) COLLATE Polish_CI_AS NOT NULL,
[imie] [varchar](50) COLLATE Polish_CI_AS NOT NULL,
[telefon] [varchar](50) COLLATE Polish_CI_AS NOT NULL
) ON [PRIMARY]


można by to osiągnąć poprzez podzapytania (tyle podzapytań ile kolumn chcesz wydobyć):


SELECT t.telefon,
(SELECT TOP(1) imie FROM klienci k WHERE k.telefon = t.telefon) as imie,
(SELECT TOP(1) nazwisko FROM klienci k WHERE k.telefon = t.telefon) as nazwisko
FROM
(SELECT DISTINCT telefon FROM klienci ) as t


SELECT * from (
SELECT [nazwisko]
,[imie]
,[telefon]
,DENSE_RANK() over (PARTITION BY [telefon] ORDER BY nAZWISKO) AS T
FROM [Aplikacja].[dbo].[klienci] ) AS r
WHERE r.T = 1


podzapytania nie są konieczne

Bingo ... zapytania nie są konieczne. Podoba mi się Twoje rozwiązanie.
Co się tyczy numerów telefonów i puli : nawet gdy one wrócą (insert z tym samym numerem) - to ... w jasny sposób ... stary wpis dotyczący numeru telefonu w bazie najczęściej traci rację bytu - choć niekoniecznie :) ... właśnie sobie uświadomiłem że chcę wydrukować fakturę sprzed 2 lat ...

OK ... przyjmuję argumentację :) i pozdrawiam

Przemek
Bartłomiej O.

Bartłomiej O. FIOBE - freelance,
web development

Temat: Duplikujące się wartości w jednej kolumnie a wszystkie...

SELECT
tab_main.*
FROM
(
SELECT
MAX(pk) as pk,
telefon
FROM
nazwa_tabeli
GROUP BY
telefon
)as tab_sub
LEFT JOIN nazwa_tabeli as tab_main ON
tab_main.pk = tab_sub.pk

pk = to klucz glowny domyslam sie ze musi jakis byc i zakladam ze najbardziej bedzie ci zalezalo na ostatnim wpisie stad MAX(pk)

Następna dyskusja:

SSIS problem z pobraniem te...




Wyślij zaproszenie do