Wyświetlanie wyniku tylko dla najświeższego wiersza dla danego kodu

0

Witajcie, pomóżcie jak zmodyfikować zapytanie, aby dawał wynik z kolumn HEIGHT, WIDTH, LENGTH, ale tylko z "najświeższego wiersza" z kolumn DATE, TIME czyli ostatniej modyfikacji (te zaznaczone na żółto), dla wspólnych danych z kolumn COD, ACT, VAL

   SELECT P.COD
	, P.ACT
	, P.VAL
 FROM <BIBLIOTEKA>.PROD AS P
  WHERE P.MAJDAT BETWEEN ? AND ?

screenshot-20240507220659.png
lub jak dodać do gotowego zapytania w innej tabeli dla wspólnych pierwszych trzech kolumn danych z tabeli PROD odpowiednich danych z kolumn HEIGHT, WIDTH, LENGTH dla ostatniej modyfikacji z kolumn DATE, TIME

   SELECT M.COD
	, M.ACT
	, M.VAL
 FROM <BIBLIOTEKA>.MOD AS M
  WHERE M.MAJDAT BETWEEN ? AND ?
0
SELECT P.COD
	, P.ACT
	, P.VAL
 FROM <BIBLIOTEKA>.PROD AS P
ORDER BY P.DATE DESC, P.TIME DESC
LIMIT 1;

Czytalem kilka razy, ale nie jestem pewny czy dobrze zrozumialem.

1

dla MS SQL byłoby to np:

SELECT R.height, R.witdt,R.length FROM PROD L
  CROSS APPLY ( SELECT TOP 1 height, witdt,length FROM Prod R WHERE R.COD=L.COD and R.ACT = L.ACT and R.VAL = L.VAR order by date desc, time desc) R;

albo np.

with cte1 as 
(SELECT COD, ACT, VAL, row_number() (over PARTITION BY COD, ACT, VAL ORDER BY date desc, time desc) as lp FROM PROD)

SELECT L.* FROM PROD L join cte1 R on R.COD=L.COD and R.ACT = L.ACT and R.VAL = L.VAR and R.lp = 1

P.S. Pisane bezpośrednio na stronie, możliwe błędy składniowe

0

Może tak (nie testowałem), mssql:

select pr.HEIGHT, pr.WIDTH, pr.LENGTH --(mozna kolejne kolumny dodac)
FROM
(
	select COD, ACT, VAL, max(DATE) max_date, max(TIME) max_time
	from PROD
	group by COD, ACT, VAL
) tab1
join PROD pr on tab1.cod = pr.cod 
				and tab1.act = pr.act 
				and tab1.val = pr.val
				and tab1.max_date = pr.date
				and tab1.max_time = pr.time
2
wemibo napisał(a):

Może tak (nie testowałem), mssql:

select pr.HEIGHT, pr.WIDTH, pr.LENGTH --(mozna kolejne kolumny dodac)
FROM
(
	select COD, ACT, VAL, max(DATE) max_date, max(TIME) max_time
	from PROD
	group by COD, ACT, VAL
) tab1
join PROD pr on tab1.cod = pr.cod 
				and tab1.act = pr.act 
				and tab1.val = pr.val
				and tab1.max_date = pr.date
				and tab1.max_time = pr.time

W Twoim zapytaniu maksymalne wartości będą liczone niezależnie, a to oznacza, że mogą wskazywać na niewłaściwy, lub nieistniejący rekord. Taki myk można wykorzystać, jeśli sortujemy (wyciągamy max) z jednej kolumny. Jesli kolumn jest więcej, to musimy je najpierw skonkatenowac, a dopiero później wyciągać max.
Trik przydatny w bazach, w których nie są dostępne funkcje okna. Po pierwsze dlatego, że mniej elegancko wygląda, a po drugie, już na dzień dobry mamy zdublowany odczyt z tabeli i wydajność spada.

0

Niestety żadne zapytanie z powyższych nie działa poprawnie lub wyskakują błędy

0

Nie bardzo wiem, gdzie to znaleźć. Ja jedynie co, to poczytałem troszkę o SQL i mogę się jedynie "bawić" samym zapytaniem wstawiając go tutaj. W pracy excela mamy "okrojonego" bez dodatków, wiec mogę tylko tutaj wstawiać zapytania.

0
lisekx napisał(a):

Nie bardzo wiem, gdzie to znaleźć. Ja jedynie co, to poczytałem troszkę o SQL i mogę się jedynie "bawić" samym zapytaniem wstawiając go tutaj. W pracy excela mamy "okrojonego" bez dodatków, wiec mogę tylko tutaj wstawiać zapytania.

To zapytaj się człowieka, który Ci wytłumaczył, gdzie masz wklejać zapytania.

"dialektów" SQL jest tyle, ile różnych baz (np. Oracle, PostgreSQL, MS SQL, MySQL, MariaDB, Firebird, etc.)
Na dodatek każda z tych baz jest (lub była) rozwijana na przestrzeni lat i w konsekwencji istnieją różne jej wersje, z których każda może obsługiwać różne zestawy instrukcji SQL.
Bez konkretnej wiedzy nt. silnika bazy (producenta i wersji) nie ruszymy z miejsca.

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