2010-06-25 35 views
6

bảng của tôi có nhiều bản ghi có cùng MemberID. tôi muốn kết quả chỉ có một bản ghi.Cách chọn Chỉ một bản ghi duy nhất từ ​​Bảng bằng cách sử dụng Biệt hiệu

select DISTINCT(MemberID) from AnnualFees; 

thì kết quả sẽ đến. nhưng tôi cũng muốn hiển thị dữ liệu cột khác nhưng khi tôi thực hiện điều này

select DISTINCT(MemberID),StartingDate,ExpiryDate,Amount from AnnualFees; 

tất cả các chi tiết bao gồm dữ liệu MemberID giống nhau cũng hiển thị.

ai đó có thể giúp tôi.

+0

Vì vậy, làm thế nào để bạn muốn chọn MỌI trong số nhiều hàng AnnualFees cho MemberID = 123 sẽ được hiển thị? Hay bạn chỉ muốn một hàng ngẫu nhiên? –

Trả lời

18

Giả sử bạn chỉ muốn bất kỳ hàng một cách ngẫu nhiên cho mỗi memberid hơn bạn có thể làm điều này:

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; 

Nếu bạn muốn có một hàng cụ thể mỗi memberid, ví dụ một với StartDate gần đây nhất thì bạn có thể sửa đổi nó để:

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: Truy vấn cuối cùng của bạn. Bạn có biết rằng điều đó có hiệu quả hơn trong Oracle so với phiên bản trong câu trả lời của tôi không? –

+1

@Martin Smith: Giải pháp phân tích (Tony's) sẽ tạo một lần truyền dữ liệu trong khi bạn sẽ thêm tự nối (có thể là một chi phí nhỏ nhưng sẽ bổ sung thêm công việc). ** Nói chung **, giải pháp của Tony do đó sẽ hiệu quả hơn. –

+0

@Vincent Cảm ơn, tôi đã tự hỏi về tính toán row_number. Tôi đoán rằng trên một pass nó phải tạo một bucket cho mỗi memberid, điền nó với ngày bắt đầu và id hàng, và sau đó sắp xếp từng nhóm. Nếu vậy tôi có thể thấy điều đó sẽ nhanh hơn. Nếu điều này đoán như thế nào nó hoạt động là hoàn toàn sai ai đó cho tôi biết! –

-3

chọn DISTINCT MemberID, StartingDate, ExpiryDate, Amount from AnnualFees;

xóa dấu ngoặc đơn

+2

Điều này sẽ trả về một hàng cho * mọi hoán vị * của MemberID, StartingDate, ExpiryDate và Amount – APC

3

Bạn cần phải chọn những hàng có MemberID trùng lặp để trả về theo một cách nào đó. Điều này sẽ nhận được hàng có startDate lớn nhất.

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

không biết nếu điều này là khá gì bạn cần, nhưng bạn có thể cần phải nhìn vào GROUP BY thay vì DISTINCT ...

nếu bạn có nhiều hồ sơ với id thành viên tương tự, bạn có thể cần phải xác định exaclty làm thế nào để xác định một trong những bạn muốn từ người khác

ví dụ như để nhận được mỗi ngày member`s khởi đầu lần cuối:

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

nhưng nếu bạn cần phải xác định một bản ghi trong các loại hình cách mà còn hiển thị các cột khác, tôi nghĩ rằng you may need to do some trickery like this ...

ví dụ như phụ truy vấn trên CHỌN với một tham gia tham gia khác cột mà bạn muốn:

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 

từ đầu đến cuối, cũng cho thấy bảng dữ liệu (o/p được bắt nguồn từ/lấy thông qua "SET VERIFY ON") ...

-- 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 

/
Các vấn đề liên quan