2010-06-25 7 views
6

Moja tabela ma kilka rekordów, które mają ten sam identyfikator MemberID. chcę uzyskać tylko jeden rekord.Jak wybrać tylko jeden unikalny rekord z tabeli przy użyciu Distinct

select DISTINCT(MemberID) from AnnualFees; 

to wynik przyjdzie. ale chcę również wyświetlić inne dane z kolumny, ale kiedy to zrobię, wszystkie szczegóły, w tym również te same dane identyfikatora członkowskiego, będą również wyświetlane. Powrót do spisu treści

Czy ktoś może mi pomóc.

+0

Jak więc wybrać opcję WHICH z wielu wierszy AnnualFees dla MemberID = 123, należy wyświetlić? A może chcesz tylko jeden losowy wiersz? –

Odpowiedz

18

Zakładając chcesz po prostu dowolny wiersz losowo dla każdego memberid niż można to zrobić:

select memberid, this, that, theother 
from 
(
select memberid, this, that, theother, 
     row_number() over (partition by memberid order by this) rn 
from annualfees 
) 
where rn = 1; 

Jeśli chciał konkretny wiersz na memberid, np jeden z najnowszych startDate następnie można go zmodyfikować do:

select memberid, this, that, theother 
from 
(
select memberid, this, that, theother, 
     row_number() over (partition by memberid order by StartDate desc) rn 
from annualfees 
) 
where rn = 1; 
+0

RE: Twoje ostatnie zapytanie. Czy zdajesz sobie sprawę, czy jest to bardziej wydajne w Oracle niż wersja w mojej odpowiedzi? –

+1

@Martin Smith: Rozwiązanie analityczne (Tony's) spowoduje jednorazowe przekazanie danych, podczas gdy twoja doda samo-łączenie (które może być niewielkim obciążeniem, ale mimo to doda pracę). ** Ogólnie **, rozwiązanie Tony'ego będzie zatem bardziej wydajne. –

+0

@Vincent Dzięki, zastanawiałem się nad kalkulacją wiersza. Zakładam, że w pojedynczym przebiegu musi utworzyć wiadro dla każdego członka, wypełnić go datami początkowymi i identyfikatorami wierszy, a następnie posortować każdy z nich. Jeśli tak, to mogę zobaczyć, że będzie szybciej. Jeśli to odgadnięcie, jak to działa, jest całkowicie błędne, niech ktoś mnie poinformuje! –

-3

wybierz DISTINCT MemberID, Data rozpoczęcia, Data ważności, Kwota od AnnualFees;

usuń nawiasach

+2

Spowoduje to zwrócenie jednego wiersza dla * każdej permutacji * identyfikatora MemberID, daty początkowej, daty wygaśnięcia i kwoty – APC

3

Musisz wybrać wiersze z zduplikowanych MemberIDs wrócić w jakiś sposób. Otrzyma to wiersz o największej wartości początkowej.

SELECT MemberID,StartingDate,ExpiryDate,Amount 
FROM AnnualFees af 
WHERE NOT EXISTS (
     SELECT * from AnnualFees af2 
     WHERE af2.MemberID = af.MemberID 
     AND af2.StartingDate > af.StartingDate) 
5

nie wiem, czy to jest zupełnie co trzeba, ale może trzeba spojrzeć na GROUP BY zamiast odrębnych ...

jeśli masz kilka rekordów z tym samym ID użytkownika, może być konieczne, aby określić exaclty jak rozpoznać ten, który chcesz od innych

np dostać każdy dzień member`s ostatni wywoławcza:

SELECT memberid, max(startingdate) 
FROM annualfees 
GROUP BY memberid 

ale jeśli trzeba zidentyfikować jeden rekord w tego rodzaju sposób, ale również wyświetlić inne kolumny, myślę you may need to do some trickery like this ...

np sub-query wyżej SELECT z przyłączenia do przyłączenia drugiego kolumny chcesz:

SELECT subq.memid, subq.startdate, a.expirydate, a.amount 
FROM (
    SELECT memberid AS memid, max(startingdate) AS startdate 
    FROM annualfees 
    GROUP BY memberid) subq 
INNER JOIN annualfees a ON a.memberid = subq.memid 
       AND a.startingdate = subq.startdate 

od początku do końca, pokazując również tabelę danych (O/P dotarli/chwycił za pomocą "SET SPRAWDZIĆ nA") ...

-- show all rows 
select * 
from annualfees 
order by memberid, startingdate 
MEMBERID    STARTINGDATE    EXPIRYDATE   AMOUNT    
---------------------- ------------------------- -------------------- -------------------- 
1      02-DEC-09     05-FEB-10   111     
1      25-JUN-10     25-JUN-11   222     
2      25-APR-10     25-JUN-13   333     

3 rows selected 

/
-- show one member`s data using max(startingdate) as selector. 
SELECT memberid, max(startingdate) 
    FROM annualfees 
    GROUP BY memberid 
MEMBERID    MAX(STARTINGDATE)   
---------------------- ------------------------- 
1      25-JUN-10     
2      25-APR-10     

2 rows selected 

/
-- show above data joined with the other columns. 
SELECT subq.memid, subq.startdate, a.expirydate, a.amount 
    FROM (
     SELECT memberid AS memid, max(startingdate) AS startdate 
     FROM annualfees 
     GROUP BY memberid) subq 
    INNER JOIN annualfees a ON a.memberid = subq.memid AND a.startingdate = subq.startdate 
MEMID     STARTDATE     EXPIRYDATE   AMOUNT    
---------------------- ------------------------- -------------------- -------------------- 
1      25-JUN-10     25-JUN-11   222     
2      25-APR-10     25-JUN-13   333     

2 rows selected 

/