Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [sql] Konstrukcja zapytania SELECT
Forum PHP.pl > Forum > Przedszkole
marcindt
Witam
Mam problem ze sformułowaniem zapytania SQL. Przedstawię poniżej problem:

Mam w bazie następującą tabelę:

t_measures:

int measure_idx
int measure_name_idx
float measure_value
date timestamp

W tabeli tej przechowywane są pomiary różnych wielkości mierzonych (measure_name_idx). Chciałbym uzyskać tylko najnowsze pomiary dla wszyskich wielkości (jest ich około 110) Zapytanie powinno zwrócić trzy zmienne: measure_name_idx, measure_value oraz timestamp.

Próbowałem następującego zapytania:
  1. SELECT measure_name_idx, measure_value, MAX(timestamp) AS maxtime
  2. FROM t_measures GROUP BY measure_name_idx, measure_value



i pojawia się błąd. Zapytanie :

  1. SELECT measure_name_idx, MAX(timestamp) AS maxtime
  2. FROM t_measures GROUP BY measure_name_idx


działa prawidłowo tyle że nie mam wartości wielkości mierzonych.

Z góry dzięki wielkie za podpowiedzi
Wykrywacz
Pokaż jaki błąd.
batman
Najprostszy sposób (co nie oznacza, że najbardziej wydajny):

  1. SELECT measure_name_idx, measure_value timestamp FROM t_measures ORDER BY timestamp DESC LIMIT 1
Wykrywacz
a to dlaczego najprostszy?
@marcindt dobrze wydaje mi się zrobił select i jest to najprostszy sposób.
Szczególnie jeżeli kilka wartości ma tą samą datę i wyjdzie jako maxymalna.

Pytanie jaki błąd mu wyrzuca.

btw. zjadłeś przecinek przed timestamp @batman smile.gif
batman
@Wykrywacz Jak zwykle jakich chochlik się wkradł winksmiley.jpg Oczywiście będzie tam przecinek.
  1. SELECT measure_name_idx, measure_value, timestamp FROM t_measures ORDER BY timestamp DESC LIMIT 1


Dlatego najprostszy, wnioskuję po tym co napisał batman, że każdy pomiar ma inny czas.
marcindt
  1. SELECT measure_name_idx, measure_value, timestamp FROM t_measures ORDER BY timestamp DESC LIMIT 1


niestety nie działa - limit 1 powoduje bład: "[Microsoft][ODBC SQL Server Driver]
[SQL] Server - pobierz, plaintext
  1. Unable TO parse query text."
  2.  
  3. dodam, że używam tego zapytania w Microsoft SQL 2005
  4.  
  5. jeżeli chodzi o zapytanie:
  6.  
  7. [sql]SELECT measure_name_idx, measure_value, MAX(timestamp) AS maxtime
  8. FROM t_measures GROUP BY measure_name_idx, measure_value
[SQL] Server - pobierz, plaintext


to błąd jest następujący: "[Microsoft][ODBC SQL Server Driver][SQL Server]A floating point exception occurred in the user process. Current transaction is canceled"

(sorki brak spacji teraz sie pojawił...już poprawiłem)

MOTYLA NOGA dry.gif
Wykrywacz
pełno dzisiaj tych chochlików
Cytat
wnioskuję po tym co napisał ....
?
Czemu bo konstrukcja select max()
jest szybciej wynonywana przez bazę smile.gif i jest dużo prostsza
(Sprawdziłem przed chwilą na 100k rekordach tongue.gif o jakieś 1,5 sekundy).


edit:
po maxtime niemasz spacji? - to jedyne co znalazłem....
pod Oraclem to działa.
batman
Wykrywacz
Nie chodziło mi o instrukcję max(). Mniejsza z tym.

Wracając do tematu. Limit 1 może nie działać, ponieważ jest to instrukcja z postgresa. Nie znam SQL servera, więc na niewiele się zdam.
marcindt
Do bani z tym "mikrosoftem" ale akurat wyboru nie mam. No nic ,dzięki za zainteresowaine. Będe walczył dalej z tematem. Jak coś się wyjaśni dam znać
luki100011
To użyj zapytania bez limit i pobierz tylko pierwszy wiersz bez pętli pobierajacej wszystko.
  1. SELECT measure_name_idx, measure_value, timestamp FROM t_measures ORDER BY timestamp
Wykrywacz
@luki35
Ale co ma dać to twoje zapytanie, pozatym że poukładane wyniki będą?
Jeżeli chodzi o wskazanie maxymalny wartości.

a masz wogóle takie pole measure_value questionmark.gif albo w nim coś bo on czepia się tego pola w błędzie bo wywala że błąd ma w A floating point exception
a pole measure_value masz jako float.
Właśnie weź je wywala z group by ...
marcindt
MAM! smile.gif Wygrzebałem w necie takie coś

  1. SELECT t.measure_name_idx, t_measure.measure_value, t_measure.timestamp
  2. FROM (SELECT measure_name_idx, MAX(timestamp) AS m_date
  3. FROM t_measure GROUP BY measure_name_idx) t LEFT OUTER JOIN t_measure
  4. ON t_measure.measure_name_idx = t.measure_name_idx AND t_measure.timestamp = t.m_date
  5. ORDER BY t.measure_name_idx




i wygląda na to, że działa, przynajmniej z SQL Managera. Zaraz dokładnie obadam czy napewno dobre wyniki wyrzuca.

to niestety nie działa tak jak trzeba:
  1. SELECT measure_name_idx, measure_value, timestamp
  2. FROM t_measures ORDER BY timestamp
Wykrywacz
Ale po co ci taki gigant.?
Powolutku.
Masz

measure_name_idx
bolek
lolek
measure_value
1.50
2.50
timestamp
2006/01/01
2007/12/31

CHcesz wiedzieć który pacjent powiedzmy pożyczył od ciebie forse jako ostatni? Czy co innego?
Bo w takim razie to jedziesz
  1. SELECT measure_name_idx, measure_value,max(timestamp) FROM dluznicy

group by w sumie jest nie potrzebny.

No chyba że masz to w kilku tablicach?
Powiedz czy to wywalenie measure_value z group by coś pomogło?
marcindt
GROUP BY musi być okniecznie jak się używa MAX() inaczej jest błąd...

gdy zapodam:
  1. SELECT measure_series_idx, measure_value, MAX(measure_date) AS Expr1
  2. FROM t_measure GROUP BY measure_series_idx, measure_value


pojawia sie błąd opisany już wczesniej: "[Microsoft][ODBC SQL Server Driver]
[SQL] Server - pobierz, plaintext
  1. A floating point exception occurred IN the user process. Current transaction IS canceled"
  2.  
  3. a gdy zrobię tak:
  4.  
  5. [sql]SELECT measure_series_idx, measure_value, MAX(measure_date) AS Expr1
  6. FROM t_measure GROUP BY measure_series_idx
[SQL] Server - pobierz, plaintext


błąd jest taki: ""[Microsoft][ODBC SQL Server Driver][SQL Server]Column 't_measure.measure_value' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause"
Wykrywacz
questionmark.gif niemożliwe max() nie wymaga potwierdzenia group by.
owszem wszelkie funkcje tak, ale nie max().


edit:
Cholera to niewiem...
a działa ci samo s
  1. elect measure_series_idx, measure_value, measure_date FROM t_measure GROUP BY measure_series_idx, measure_value


jak tak to spróbuj
  1. SELECT measure_series_idx, measure_value, measure_date
  2. FROM t_measure WHERE measure_value IN (SELECT measure_value, MAX(measure_date)
  3. FROM t_measure GROUP BY measure_value )
  4. GROUP BY measure_series_idx, measure_value


albo
  1. SELECT measure_series_idx, measure_date
  2. FROM t_measure WHERE measure_value IN (SELECT measure_value, MAX(measure_date)
  3. FROM t_measure GROUP BY measure_value )
  4. GROUP BY measure_series_idx
marcindt
  1. SELECT measure_series_idx, measure_value, measure_date
  2. FROM t_measure GROUP BY measure_series_idx, measure_value


nie działa - measure_date nie jest w klauzuli GROUP BY czy jakoś tak

dwa kolejne zapytania tez nie działają: "Only one expression can be specified in the select list when the subquwry is not introduced with EXISTS"
batman
Mimo, że na SQL server się nie znam, ale to powinno pomóc:
  1. SELECT measure_series_idx, measure_value, MAX(measure_date) AS Expr1 FROM t_measure GROUP BY measure_series_idx, measure_value
marcindt
  1. SELECT measure_series_idx, measure_value, MAX(measure_date) AS Expr1
  2. FROM t_measure GROUP BY measure_series_idx, measure_value



niestety bylo to pierwsze zapytanie jakie wymysliłem, które powinno działać na zdrowy rosądek ale NIE DIAŁA (na samy początku opisany błąd jest)

oki chyba użyjętego długiego zapytanie, które napisałem wcześniej - jedyne działające na moim serwerze SQL - kończę już pracę wiec do poniedziałku
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.