SELECT TOP n Duplicit   zodpovězená otázka

SQL, Databáze

Zdravim,

Mam tu taku situaciu s ktorej sa neviem nejako vyhrabat. Vytvoril som si nejaky select (Pivot tabulka) na ktorej uz potrebujem v poslednom ktoru vyfiltrovat N pocet duplicit. Nemate nejake "finty" ktorymi by som to dokazal ?

Pre priklad:

mam tabulku

ID,ParentID,Value

1,1,Value1

2,1,Value2

3,1,Value3

4,2,Value4

5,2,Value5

6,2,Value6

7,2,Value7

8,3,Value8

9,3,Value9

a potrebujem z nej:

ID,ParentID,Value

1,1,Value1

2,1,Value2

4,2,Value4

5,2,Value5

8,3,Value8

9,3,Value9

Cize na zaklade ParentID si chcem nastavit kolko top N duplicit tam moze byt.

Hm ale neviem ci som to spravne vysvetlil. Snad sa da tomu pochopit.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A standardní select Vám nestačí?Něco jako:

SELECT TOP n * FROM table WHERE ParentID = 'x' || in ()

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Urcite nie... Predsa ked pouzijem top tam mi len cely select usekne...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Já myslím,že určitě ano.Pokud Vám jde o to vypsat N duplicit pro určité ParentID.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ja celkovy vysledok nemozem topovat. Ten musi zobrazit vzdy vsetky zaznami.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pak nevím v čem je problém nebo oč Vám jde.

Z popisu mi to není moc jasné a navíc mi přijde,že takto jednoduché věci lze řešit pomocí selectů,ať už trochu složitějších nebo vnořených.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Tohle jednoduchým nebo vnořeným selectem nepůjde. Nemáte jak říct, které řádky se mají z jednotlivých skupin vzít a které ne. Na tohle je v SQL Serveru sada tzv. RANKING funkcí. Viz můj další příspěvek nebo: http://msdn.microsoft.com/en-us/library/...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tohle pomocí TOP neuděláte - ten se aplikuje na celkový výstup.

Vám pomůže ranking funkce ROW_NUMBER, která čísluje řádky a číslování dokáže rozdělit podle kritérií definovaných parametrem PARTITION BY. Definujete tedy podle čeho chcete řadit (například Id) a pak podle čeho chcete udělat skupiny, které se číslují samostatně (tedy ParentId předpokládám).

Podle čísel řádků pak můžete filtrovat výsledek. Například:

select *
	from (
		select
			 *,
			 ROW_NUMBER() OVER (PARTITION BY [ParentId] ORDER BY [Id] ASC) AS groupRowNumber -- cislovat radky od nejmensiho po nejvetsi [Id], samostatne cislovat skupiny podle [ParentId]
			FROM [Tabulka]
	) src
	where 
		groupRowNumber <= 2 -- maximalni pocet radku od kazde skupiny
	order by
		[ParentId], groupRowNumber
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Presne to som potreboval ! Velmi pekne dakujem :) Ja som to tu riesil uplne zlozito ale toto mi to uplne zjendodusilo. Dik este raz.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback