2009-09-18 31 views
6

Tôi có một temptable trông như thế này:Làm cách nào để chỉ trả về 1 hàng nếu có nhiều hàng trùng lặp và vẫn trả về các hàng không trùng lặp?

RequestID | CreatedDate   | HistoryStatus   
CF-0000001 | 8/26/2009 1:07:01 PM | For Review 
CF-0000001 | 8/26/2009 1:07:01 PM | Completed 
CF-0000112 | 8/26/2009 1:07:01 PM | For Review 
CF-0000113 | 8/26/2009 1:07:01 PM | For Review 
CF-0000114 | 8/26/2009 1:07:01 PM | Completed 
CF-0000115 | 8/26/2009 1:07:01 PM | Completed 

Và làm thế nào tôi muốn bảng để nhìn cuối cùng là như thế này:

RequestID | CreatedDate   | HistoryStatus   
CF-0000001 | 8/26/2009 1:07:01 PM | Completed 
CF-0000112 | 8/26/2009 1:07:01 PM | For Review 
CF-0000113 | 8/26/2009 1:07:01 PM | For Review 
CF-0000114 | 8/26/2009 1:07:01 PM | Completed 
CF-0000115 | 8/26/2009 1:07:01 PM | Completed 

Tức là trùng lặp CF-0000001 cần được loại bỏ.

Làm cách nào tôi có thể trả lại hoặc tôi nên nói chỉ chọn MỘT hàng nếu có nhiều hàng trùng lặp và vẫn trả về các hàng không trùng lặp?

+6

Cả hai bảng đều giống nhau. Vui lòng sửa sản lượng mong muốn. – shahkalpesh

+0

Trả lại các bản sao trong ** GÌ **? MySQL SQL? Oracle SQL? CouchDB? Cassandra? MS SQL Server? Một danh sách trong Haskell? Một SQuery cho hiểu trong Scala? Một tập tin văn bản trong Perl? Cậu bé, tôi có thể tiếp tục ... –

+1

Hàng nào sẽ được trả về nếu RequestID và CreatedDate đều giống nhau? Hay nó không quan trọng? – eksortso

Trả lời

0

Nếu đây là một câu hỏi SQL, và tôi hiểu những gì bạn đang yêu cầu, (nó không hoàn toàn rõ ràng), chỉ cần thêm rõ rệt với truy vấn

Select Distinct * From TempTable 
+1

Điều đó sẽ không giúp Chebu , bởi vì các giá trị trong HistoryStatus là khác nhau. – eksortso

4
select t.* 
from (
    select RequestID, max(CreatedDate) as MaxCreatedDate 
    from table1 
    group by RequestID 
) tm 
inner join table1 t on tm.RequestID = t.RequestID and tm.MaxCreatedDate = t.CreatedDate 
+0

Truy vấn này sẽ chỉ trả về "trùng lặp" một lần nữa. Các giá trị của 'CreatedDate' giống nhau khi' RequestID = 'CF-0000001''. – eksortso

+0

Mặc dù dữ liệu không hiển thị nó, tôi thực sự giả sử thời gian sẽ khác, nếu không thì không có cách nào để biết trạng thái nào cần được trả lại khi có hai lỗi mà không mã hóa nó ... thực sự không phải là rất tốt câu hỏi được diễn đạt. – RedFilter

5

Từ tựa đề Tôi đoán bạn chỉ cần một kết quả cho mỗi hàng duy nhất? Nếu đúng như vậy, hãy xem mệnh đề GROUP BY (hoặc SELECT DISTINCT).

3

Nếu bạn có mối quan hệ một đến nhiều trong truy vấn của mình, các hàng trùng lặp có thể xuất hiện ở một bên.

Giả sử sau

TABLE TEAM 
ID  TEAM_NAME 
0  BULLS 
1  LAKERS 


TABLE PLAYER 
ID  TEAM_ID  PLAYER_NAME 
0  0   JORDAN 
1  0   PIPPEN 

Và bạn thực hiện một truy vấn như

SELECT 
    TEAM.TEAM_NAME, 
    PLAYER.PLAYER_NAME 
FROM TEAM 
INNER JOIN PLAYER 

Bạn sẽ nhận được

TEAM_NAME PLAYER_NAME 
BULLS  JORDAN 
BULLS  PIPPEN 

Vì vậy, bạn sẽ có trùng lặp TÊN TEAM. Thậm chí sử dụng khoản riêng biệt, tập hợp kết quả của bạn sẽ chứa trùng lặp TEAM TÊN

Vì vậy, nếu bạn không muốn TEAM_NAME trùng lặp trong truy vấn của bạn, làm như sau

SELECT ID, TEAM_NAME FROM TEAM 

Và đối với mỗi ID nhóm gặp phải thực hiện

SELECT PLAYER_NAME FROM PLAYER WHERE TEAM_ID = <PUT_TEAM_ID_RIGHT_HERE> 

Vì vậy, bằng cách này bạn sẽ không nhận được bản sao tài liệu tham khảo ở một bên

regards,

11

Hãy thử điều này nếu bạn muốn hiển thị một trong các hàng trùng lặp dựa trên RequestID và CreatedDate và hiển thị HistoryStatus mới nhất.

with t as (select row_number()over(partition by RequestID,CreatedDate order by RequestID) as rnum,* from tbltmp) 
Select RequestID,CreatedDate,HistoryStatus from t a where rnum in (SELECT Max(rnum) FROM t GROUP BY RequestID,CreatedDate having t.RequestID=a.RequestID) 

hoặc nếu bạn muốn chọn một trong các hàng trùng lặp xem xét Chỉ tạo và hiển thị HistoryStatus mới nhất, hãy thử truy vấn bên dưới.

with t as (select row_number()over(partition by CreatedDate order by RequestID) as rnum,* from tbltmp) 
Select RequestID,CreatedDate,HistoryStatus from t where rnum = (SELECT Max(rnum) FROM t) 

Hoặc nếu bạn muốn chọn một trong những hàng trùng lặp xem xét Yêu cầu ID duy nhất và hiển thị các HistoryStatus mới nhất sau đó sử dụng các truy vấn dưới đây

with t as (select row_number()over(partition by RequestID order by RequestID) as rnum,* from tbltmp) 
Select RequestID,CreatedDate,HistoryStatus from t a where rnum in (SELECT Max(rnum) FROM t GROUP BY RequestID,CreatedDate having t.RequestID=a.RequestID) 

Tất cả các truy vấn trên tôi đã viết trong sql server 2005

+0

tốt, tôi đã bỏ phiếu bạn tình cờ khi cố gắng sao chép-dán mã mẫu của bạn. ... Và hệ thống sẽ không cho phép tôi đảo ngược nó vì vậy tôi đổi thành "upvote" và đó là may mắn của bạn :-) – Sukotto

-3

Để chỉ lấy một bản ghi riêng biệt từ cột trùng lặp của hai hàng, bạn có thể sử dụng cột "rowid" được duy trì bằng chính oracle làm khóa chính, vì vậy trước tiên hãy thử

"select rowid,RequestID,CreatedDate,HistoryStatus from temptable;" 

và sau đó bạn có thể tìm nạp hàng thứ hai chỉ bằng giá trị của cột 'rowid' bằng cách sử dụng trong câu lệnh SELECT.

+0

Giả sử Oracle, và làm thế nào để bạn "tìm nạp hàng thứ hai bằng giá trị của rowid"? Nếu ai đó cần phải nhìn vào tập kết quả để tìm ra những gì đó là, đó không phải là một "giải pháp" rất thú vị. Vui lòng [sửa] câu hỏi của bạn nếu bạn biết cách viết truy vấn thực hiện điều đó (không có người chọn một hàng). – Mat

0
select * from temptable 
where rnum --unique key 
in 

( 
SELECT RNUM --unique key 
    FROM temptable 
WHERE ( HistoryStatus 
) IN (SELECT    HistoryStatus 

          FROM temptable 
          GROUP BY     
HistoryStatus 
          HAVING COUNT(*) <= 1)); 

Tôi chưa thử nghiệm mã này. Tôi đã sử dụng mã tương tự và nó hoạt động. Cú pháp nằm trong Oracle.

-2

hãy thử sử dụng chọn riêng biệt x. * Từ ( truy vấn của bạn )

Cảm ơn.

+0

Sử dụng riêng biệt nó sẽ chỉ cung cấp các giá trị khác biệt từ bảng x, nhưng không chỉ từ các bảng khác mà bạn đang tham gia –

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