10 zestawów o najwyższym timestampie

0

Z bazy MSSQL potrzebuję wybrać 10 zestawów danych o najwyższych timestampach

struktura jest taka:

Nazwa Wartość Timestamp
Imię Adam (poniedziałek)
Nazwisko Kowalski (poniedziałek)
Imię Piotr (wtorek)
Nazwisko Nowak (wtorek)
... ... (...)

timestampy są takie same dla wszystkich zestawów danych (Imię, Nazwisko... może dojść więcej pól)
Niestety struktura bazy jest taka jaka jest i nie mogę jej zmienić

Trzeba tu użyć podzapytania?
Da się jakoś to zorganizować żeby wyniki się lepiej przeglądało? Jakaś zamiana wierszy na kolumny? W SQL dawno się nie bawiłem i mało co pamiętam

0

Hmm... a co jest kluczem głównym w tej tabeli?

0

wątpię aby ktokolwiek wymyślił o co Ci chodzi. Jak chcesz odpowiedz to po pierwsze dajesz przykładowe dane a po drugie co chcesz z nich uzyskać. Co to zestaw danych? Timestamp ma zapisany datę i godzinę a nie poniedziałek/wtorek/itp - mam rozumieć, że dane mają najdalej tydzień???

0

Generalna zasada rozwiązania takiego problemu: sortujesz malejąco po interesującej cię kolumnie i wybierasz 10 pierwszy rekordów. Robisz to jednym zapytaniem.
Ale jak Misiekd napisał, coś sensowniejszego da się napisać po podaniu większej liczby szczegółów.

1

Prawdopodobnie chodzi o to, aby zrobić pivota na tabeli i żeby ona wyglądała następująco :

Imię Nazwisko Timestamp
Adam Kowalski 2000-05-04
Zenon Nowak 2001-06-01

Sam znam SQL na poziomie podstawowy i po przemyśleniach dalej nic nie wymyśliłem. Tzn mój pivot mi nie wychodzi... gdyż nie można w nim stosować select distinct.

Proste obejście tego problemu to wziąć wykonać select na tabeli, sortując najpierw malejąco wg daty a następnie wg nazwy. Sam mówisz że pól może dojść domyślam się ,że tabela wtedy wyglądała by w następujący sposób :

Nazwa Wartość Timestamp
Imie Adam 2000-05-04
Nazwisko Kowalski 2000-05-04
Wiek 16 2000-05-04
LiczbaDzieci 2 2000-05-04

itd, wtedy polecenie powinno wyglądać tak

 
SELECT TOP 40 Wartosc FROM Tabela
ORDER BY Timestamp DESC, Wartosc ASC

**
TOP 40** - daltego, że wyciągasz 4 pola Imie, Nazwisko, Wiek, LiczbaDzieci, a łącznie chcesz wyciągnąć dane 10 użytkowników.
Wyniki dla wszystkich userów będą zwracane w formie

Result

Adam //imie
2 //liczba dzieci
Kowalski //nazwisko
16 // wiek

Teraz wyniki masz jakoś ustandaryzowane, co prawda nie eliminuje to kłopotu, ale możesz sobie z wyników zrobić jakąś pętle w php

for($i=0;$i<40;$i+4)
{
tablica[$i] = imie
tablica[$i+1] = liczba dzieci
tablica[$i+2] = nazwisko
tablica[$i+3] = wiek
}
<edit> @unikalna_nazwa

Najlepsze wyjście to pivot, ale jak napisałem nie wiem jak go wykonać, choć w przypadku pivotu przy dodaniu jakiegoś "atrybutu" do bazy, musiałbyś zmieniać zapytanie. Najlepsze wyjście to użycie procedury, która zwraca X rekordów, x sobie sam byś wyliczył.
A.. tylko wtedy zamiast TOP musisz użyć SET ROWCOUNT

0

tak o to chodzi! dzięki wielkie za zrozumienie tomkos - jednak jak widać dało się "domyśleć" o co chodziło :)
faktycznie tak zrobić najłatwiej i chyba tak zrobię
musiałbym jednak zrobić pojedyncze zapytanie zwracające ilość pól dla jednego zestawu danych (w Twoim przypadku 4)
no ale trudno - tak prawdopodobnie zrobię jeżeli ktoś nie podpowie jeszcze inaczej...

0

podbijam

zrobiłem początkowo zapytanie:

SELECT TOP 1160 nazwa, wartosc FROM tabela ORDER BY czas DESC, nazwa ASC

(1160 bo dla jednego wpisu jest 116 pól)
ale zapytanie wykonywało się ponad 3 sekundy (:O)
założyłem indeks na "czas", ale nic to nie zmieniło

zmieniłem więc zapytanie na:

SELECT nazwa, wartosc FROM tabela WHERE czas IN
    (SELECT DISTINCT TOP 10 czas FROM tabela ORDER BY czas DESC)
    ORDER BY nazwa ASC

zapytanie niby bardziej złożone, ale wykonuje się w mgnieniu oka nawet bez indeksu (i w dodatku nie potrzebna jest wiedza o ilości pól :) )
ktoś wyjaśni?

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