Najnowsza data dla każdej z wartości

Odpowiedz Nowy wątek
2018-11-15 11:10
0

Cześć,
Potrzebuję podpowiedzi przy pisaniu zapytania. Mam np:
id wartosc date


1 78324 2009-01-26 15:03:00.000
2 90682 2009-01-26 15:47:08.000
3 78323 2009-01-26 15:49:16.000
4 92511 2009-01-26 16:00:37.000
5 92511 2009-01-26 16:00:46.000
6 92511 2009-01-26 16:01:00.000
7 92511 2009-01-26 16:01:26.000

Chciałbym by zapytanie zwróciło mi id wartość oraz datę tylko dla najnowszej daty więc w tym wypadku:
1 78324 2009-01-26 15:03:00.000
2 90682 2009-01-26 15:47:08.000
3 78323 2009-01-26 15:49:16.000
7 92511 2009-01-26 16:01:26.000

Póki co napisałem coś takiego:
SELECT a.id, a.wartosc, a.date FROM tabela a
WHERE a.datetime = ( SELECT MAX( date ) FROM tabela WHERE id_tow = a.wartosc

Jednak to zwraca mi tylko jeden rekord z najnowsza wartością zamiast każdego rekordu i dla niego najnowsza wartość.

Pomoże ktoś?

Pozostało 580 znaków

2018-11-15 11:15
0

Najnowsza data zawsze jest i będzie tylko jedna - inaczej nie byłaby przecież najnowsza.

Opisz swój problem jeszcze raz, ponieważ póki co nie wiadomo wcale dlaczego wybrałeś akurat wiersze #1, #2, #3 i #7, nawet jeśli jest to oczywiste dla Ciebie.


edytowany 2x, ostatnio: Patryk27, 2018-11-15 11:16

Pozostało 580 znaków

2018-11-15 11:25
0

Chciałbym by zapytanie zwracało wszystkie wartości(wartości powtarzają się) ale tylko raz z najnowszymi datami (pomimo, że w bazie występują np 100 razy z różnymi datami)

edytowany 1x, ostatnio: Runon, 2018-11-15 11:26

Pozostało 580 znaków

2018-11-15 11:29
0

Spróbuj tak:

SELECT
  `rows`.`number`,
  max(`rows`.`date`)

FROM `rows`

GROUP BY `rows`.`number`

edytowany 1x, ostatnio: Patryk27, 2018-11-15 11:30
edit: tym sposobem nie dostaniesz niestety id (chyba że zrobisz max(rows.id)), więc jeśli zależy Ci na nim, pozostaje rozwiązanie @Marcin.Miga lub np. zabawa z funkcjami okna. - Patryk27 2018-11-15 11:35

Pozostało 580 znaków

2018-11-15 11:32
SELECT a.id, a.wartosc, a.date FROM tabela a JOIN (SELECT wartosc, Max(datetime) dt FROM tabela GROUP BY wartosc)  sub ON (sub.wartosc, sub.dt)=(a.wartosc, a.datetime)
Heh szybszy ... napisałeś to w "tri miga" :P ;) - BlackBad 2018-11-15 11:35

Pozostało 580 znaków

2018-11-15 11:34
1
WITH CTE
as 
(SELECT wartosc, MAX(date) LastDate
 FROM tabela
Group by wartosc);

SELECT a.id, a.wartosc, a.date
FROM tabela a INNERJOIN CTE
ON a.date = CTE.LastDate

Pozostało 580 znaków

2018-11-15 12:03
0

Konkret Panowie! Dzięki!

Pozostało 580 znaków

2018-11-15 12:13
0

Z funkcją analityczną:

select 
   b.id,b.wartosc,b.date 
from (
  select 
   a.id,
   a.wartosc,
   a.date,
   row_number() over (partition by a.wartosc order by a.date desc) rn 
  from tabela a) b where b.rn=1; 

Dla każdej wartości numerujemy wiersze w porządku malejącym i wybieramy wiersze z numerem 1.

Nie podał bazy, więc nie wiadomo, czy ma funkcje window... - Marcin.Miga 2018-11-15 12:58
To prawda, jak ma jakiś niszowy silnik to nie zadziała mu to zapytanie. Podejrzewałbym, że tak mają bazy klasy Access, SQLLite, może H2/HSQLDB i starsze MySQLe. - yarel 2018-11-15 13:17

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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