Sortowanie po dacie nie działa?

0

Witam.
Wie ktoś dlaczego takie zapytanie nie sortuje mi po dacie ?
Zapytanie jest nieposortowane, daty są w losowej kolejności

		SELECT * FROM (
		select TOP 100 PERCENT RowNumber,
			Id, 
			CreatedOn, 
			Name, 
			Description, 
			Address, 
			UserName, 
			Pet, 
			FileName, 
			Type, 
			TypeName  
		from #Results  
		order by CreatedOn desc
		) T

już nie za bardzo wiem co tu na to wpływa :)

0

Wywal zewnetrznego selecta i TOP 100 PERCENT

0

robię paginację, więc muszę mieć tak wyglądające zapytanie :) tylko paginacja musi być chronologicznie

		SELECT * FROM (
		select TOP 100 PERCENT RowNumber,
			Id, 
			CreatedOn, 
			Name, 
			Description, 
			Address, 
			UserName, 
			Pet, 
			FileName, 
			Type, 
			TypeName  
		from #Results  
		order by CreatedOn desc
		) T
		WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1 
0

Nie musisz mieć podzapytania:

select RowNumber,
 			Id, 
 			CreatedOn, 
 			Name, 
 			Description, 
 			Address, 
 			UserName, 
 			Pet, 
 			FileName, 
 			Type, 
 			TypeName  
 		from #Results  
 		WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1 
order by CreatedOn desc
 		
0

nie wiem czy to będzie miało zastosowanie w Twojej sytuacji ale zwróć uwagę jak filtrujesz between-em daty, chodzi mi o typ danych. Jak kiedyś filtrowałem po typie "date" a dane w bazie miałem jako "timestamp" i przy between-ie wychodziły mi misz masz, długo nie wiedziałam o co chodzi. Myślałem, że SQL Server robi takie rzeczy w "locie" ale czasami trzeba przekonwertować jakąś datę na inny typ i wszystko gra.

0

Byłoby łatwiej jakbyś napisał co to za standard lub engine.
A dane w pierwszej wersji masz posortowane, tylko tego nie widzisz.

Kolejność jest mniej wiecej taka (zgodnie z tym co piszesz):

  • weź milion rekordów
  • posortuj
  • wydziel 10 sztuk (zapytanie zewnętrzne)
  • weź te 10 sztuk w dowolnej kolejności (zapytanie zewnętrzne)
0
Panczo napisał(a):

Nie musisz mieć podzapytania:

select RowNumber,
 			Id, 
 			CreatedOn, 
 			Name, 
 			Description, 
 			Address, 
 			UserName, 
 			Pet, 
 			FileName, 
 			Type, 
 			TypeName  
 		from #Results  
 		WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1 
order by CreatedOn desc
 		

Na komentarz za długie... ;)

Fizyczne (w blokach/stronach) wiersze zapisywane są w kolejności wstawiania (w dużym uproszczeniu).Silnik bazodanowy numeruje wiersze w kolejności odczytu ich ze stron/bloków (znowu w uproszczeniu). Usuwanie powoduje "dziury" w blokach/stronach, które mogą być wypełniane np. nowymi wierszami, albo miejsce odzyskiwane przez operacje typu "defragmentacja" (np. oraclowe table shrink space + compact).

W bloku/stronie możesz mieć układ danych:
Rownum=1 : created_on=2007
Rownym=2 : created_on=2008
Rownum=3 : created_on=2002

Jak weźmiesz Rownum 1..2, i posortujesz po dacie to otrzymasz daty 2007,2008.
Jak weźmiesz posortujesz po dacie i weźmiesz rownum 1..2 to otrzymasz 2002,2007.

Czyli różne wyniki.

2
yarel napisał(a):

W bloku/stronie możesz mieć układ danych:
Rownum=1 : created_on=2007
Rownym=2 : created_on=2008
Rownum=3 : created_on=2002

Jak weźmiesz Rownum 1..2, i posortujesz po dacie to otrzymasz daty 2007,2008.
Jak weźmiesz posortujesz po dacie i weźmiesz rownum 1..2 to otrzymasz 2002,2007.

Czyli różne wyniki.

Zakładając, że jest to Oracle i używasz Rownum...
ale:

  1. OP używa kolumny Rownumber
  2. O ile się nie mylę Oracle nie ma w składni TOP
  3. w Oracle nie występuje prefix # w nazwach tabel
  4. Dostep do zmiennych poprzedzony jest $ a nie @

Ja podejrzewam, że to jest SQL Server

1 użytkowników online, w tym zalogowanych: 0, gości: 1