Unikalne wartości zależne od daty

0

Czesc,

nie wiem jak zbudowac, czy w ogole jest to mozliwe, zapytanie, ktore wyciagnie mi wszystkie wartosci z bazy, ale po maksymalnie jednym rekordzie dla tego samego klucza, wybierajac najnowszy, np.

tabela pracownik


| Nazwisko | car_id|

| Nowak | 1
| Kowalski | 2
| Popek | 3
| Nowak | 4

tabela samochod


| id | Nazwa | Data dodania |

| 1 | VW | 10.10.2013
| 2 | Fiat | 10.10.2013
| 3 |Daewoo | 11.10 2013
| 4 |Porsche | 08.10.2013

i teraz chcialbym, zeby zwrocilo mi taki rezultat:

Nowak VW 10.10.2013
Kowalski Fiat 10.10.2013
Popek Daewoo 11.10.2013

Nie mam pojecia jak to zrobic, wiec licze na jakies podpowiedzi :)

0

A teraz łaskawie pokaż przykład kiedy w danych faktycznie masz "więcej niż jeden rekord dla tego samego klucza". Bo póki co twój przykład jest zupełnie bez sensu.

0

a jak będzie tak

| id | Nazwa | Data dodania |

| 1 | VW | 10.10.2013
| 2 | Fiat | 10.10.2013
| 3 |Daewoo | 11.10 2013
| 4 |Porsche | 10.10.2013
to co ma być w wyniku??

0

@Shalom ok, faktycznie w pierwszej tabeli zapomnialem wpisac id, nazwisko jest jedna z kolumn i wlasnie na jego podstawie chce wybrac unikalna wartosc, czyli to nazwisko, ktore najpozniejsza date dodania.

@abrakadaber ta data byla taka przykladowa, ogolnie jest bardziej rozbudowana, bo to timestamp.

0

A no jak tak,. to możemy pogadać...

SELECT * FROM pracownik p JOIN samochod s ON p.car_id=s.id JOIN (SELECT Max(id) m_id FROM pracownik GROUP BY nazwisko) x ON x.m_id=p.id
0

Chyba udało mi się zrozumieć, o co chodzi autorowi tematu. Zakładając, że te daty dodania są unikalne (jak sam powiedziałeś, używasz tam timestamp, więc można tak założyć), zadziała takie zapytanie:

select nest.nazw,nest.dat,sa.nazwa from
  (select nazwisko nazw, max(data_dodania) dat
  from pracownik p join samochod s on p.car_id=s.id
group by nazwisko) nest
join samochod sa
on nest.dat=sa.data_dodania

Do przećwiczenia na:
http://sqlfiddle.com/#!4/e7be7/2

0

@Hrypa

super, wlasnie o to mi chodzilo :)

a czy moglbys powiedziec mi co powinienem zmienic, zeby dzialalo, jesli pole z data bedzie w tabeli pracownik?

czyli:

Create table pracownik (
  nazwisko varchar2(40),
  car_id number,
  data_dodania date
  );
Create table samochod (
  id number,
  nazwa varchar2(40)
  );

insert into pracownik (nazwisko,car_id,data_dodania) values ('Nowak',1,to_date('10-10-2013','DD-MM-YYYY'));
insert into pracownik (nazwisko,car_id,data_dodania) values ('Kowalski',2,to_date('12-10-2013','DD-MM-YYYY'));
insert into pracownik (nazwisko,car_id,data_dodania) values ('Popek',3,to_date('11-10-2013','DD-MM-YYYY'));
insert into pracownik (nazwisko,car_id,data_dodania) values ('Nowak',4,to_date('09-10-2013','DD-MM-YYYY'));

insert into samochod (id,nazwa) values
(1,'VW');
insert into samochod (id,nazwa) values
(2,'Fiat');
insert into samochod (id,nazwa) values
(3,'Daewoo');
insert into samochod (id,nazwa) values
(4,'Porsche');
commit;
 

Probowalem sobie to pozmieniac, ale zwraca mi wszystkie 4 rezultaty zamiast 3.

0

Wtedy jest jeszcze prościej:

select p.nazwisko,s.nazwa,p.data_dodania
from pracownik p join samochod s on p.car_id=s.id
where p.data_dodania = (
  select max(pp.data_dodania) from pracownik pp
  where pp.nazwisko=p.nazwisko)
0
SELECT p.*,s.* FROM pracownik p JOIN samochod s ON p.car_id=s.id JOIN (SELECT MAX(data_dodania) m_data_dodania FROM pracownik GROUP BY nazwisko) x ON x.m_data_dodania=p.data_dodania

Lub korzystając z funkcji WINDOW:

select distinct p.nazwisko, first_value(s.nazwa) over(partition by p.nazwisko order by p.data_dodania desc) nazwa, first_value(p.data_dodania) over(partition by p.nazwisko order by p.data_dodania desc) data_dodania FROM pracownik p JOIN samochod s ON p.car_id=s.id 
0

Dzięki wam bardzo za pomoc :)) wszystko działa pięknie:)

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