2009-09-18 20 views
6

Ben şöyle bir TempTable vardır:Birden çok yinelenen satır varsa ve hala çoğaltılamayan satırları döndürürseniz yalnızca 1 satır nasıl döndürülür?

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 

Ve sonunda bakmak masa istiyorum nasıl şu şekildedir:

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 

yani yinelenen CF-0000001 kaldırılmalıdır.

Birden çok yinelenen satır varsa ve yinelenen satırları döndürmeye devam ederse, yalnızca TEK satırını seçebilir miyim?

+6

Her iki tablo da aynıdır. Lütfen beklenen çıktıyı düzeltin. – shahkalpesh

+0

İade çiftleri ** içinde NE dönüşü **? MySQL SQL? Oracle SQL? CouchDB? Cassandra? MS SQL Server? Haskell'de Bir Liste? Scala'da SQuery for-understand anlama? Perl'deki bir metin dosyası mı? Evlat, devam edebilirim ... –

+1

RequestID ve CreatedDate'in ikisi de aynı mı olacak? Yoksa önemi yok mu? – eksortso

cevap

0

bu SQL soru ve ben, sadece seni tahmin ediyorum Başlıktan sorguya

Select Distinct * From TempTable 
+1

Çünkü HistoryStatus'taki değerler farklıdır. – 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

Bu sorgu, "yinelenenleri" tekrar döndürecektir. RequestID = 'CF-0000001' olduğunda 'CreatedDate 'değerleri aynıdır. – eksortso

+0

Veriler bunu göstermese de, aslında zamanların farklı olacağını varsayıyordum, aksi halde kodlama yapmadan çiftler olduğunda hangi durumun döndürüleceğini bilmenin bir yolu yok ... gerçekten çok iyi değil. dertli soru. – RedFilter

5

için ayrı eklemek (tamamen net değil), ne soran anlamak benzersiz satır başına yalnızca bir sonuca mı ihtiyacınız var? Durum buysa, GROUP BY maddesine (veya SELECT DISTINCT) bir göz atın.

3

Sorgunuzda çok fazla ilişki varsa, bir satırda yinelenen satırlar oluşabilir. Sen

TEAM_NAME PLAYER_NAME 
BULLS  JORDAN 
BULLS  PIPPEN 

Yani yinelenen TAKIM ADI olacak alacak

aşağıdaki

TABLE TEAM 
ID  TEAM_NAME 
0  BULLS 
1  LAKERS 


TABLE PLAYER 
ID  TEAM_ID  PLAYER_NAME 
0  0   JORDAN 
1  0   PIPPEN 

varsayalım Ve

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

gibi bir sorgu yürütmek. Hatta DISTINCT cümleciği kullanarak Sorgunuzu yinelenen TEAM_NAME istemiyorsunuz eğer sonuç kümesi yapmak, yinelenen Takım adı

içerecektir

SELECT ID, TEAM_NAME FROM TEAM 

Ve karşılaşılan her takım kimliği için aşağıdaki

SELECT PLAYER_NAME FROM PLAYER WHERE TEAM_ID = <PUT_TEAM_ID_RIGHT_HERE> 
çalıştırır

Yani bu şekilde bir tarafta çiftleri başvuruları almazsınız

Saygılarımızla,

11

RequestID ve CreatedDate'e göre yinelenen satırlardan birini görüntülemek ve en son HistoryStatus'u göstermek istiyorsanız bunu deneyin.

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) 

veya CreatedDate yalnızca dikkate yinelenen satırlardan birini seçmek istiyor ve en son HistoryStatus ardından aşağıdaki sorgu deneyin gösterirseniz.

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) 

Yoksa yalnızca İstek kimliğini dikkate yinelenen satırlardan birini seçmek istiyor ve en son HistoryStatus sonra

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) 

aşağıdaki I sql server 2005 yazdım Yukarıdaki tüm sorguları sorgu kullanmak gösterirseniz .

+0

iyi, örnek kod kopyalayıp yapıştırmaya çalışırken sizi yanlışlıkla kazandım. ... Ve sistem tersine çevirmeme izin vermeyecek, ben de "yükseltmeye" geçiyorum ve bu senin iyi şansın :-) – Sukotto

-3

bu yüzden ilk

deneyin İlköğretim anahtar olarak oracle kendisi tarafından korunur siz "rowid" sütununu kullanabilirsiniz iki sıranın yinelenen sütundan tek ayrı bir kayıt getirme için
"select rowid,RequestID,CreatedDate,HistoryStatus from temptable;" 

ve sonra ikinci satırı yalnızca SELECT ifadesinde kullanarak 'rowid' sütununun değeriyle getirebilirsiniz.

+0

Bu, Oracle'ı varsayıyor ve "ikinci sırayı, sıradaki değeriyle nasıl" getiriyorsunuz? Birinin sonuç kümesine ne olduğunu anlamak için bakması gerekiyorsa, bu çok ilginç bir “çözüm” değildir. Sorunu nasıl yazacağınızı (eğer insanı bir satır dizisi seçmeden) biliyorsanız, lütfen sorunuz [değiştir]. – 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)); 

Bu kodu test etmedim. Benzer kodu kullandım ve işe yarıyor. Sözdizimi Oracle'da.

-2

seçme ayrı x kullanmayı deneyin. * ( Sorgunuzun )

Thanks.

+0

Farklı kullanarak, x tablosundan yalnızca farklı değerler verir, ancak katıldığınız diğer tablolardan değil –

İlgili konular