Wpis z mikrobloga

Czesc Mirki,

Potrzebuje napisac zapytanie o wyciagniecie tylko pierwszego userid z kazdego z numerow zamowienia (ReferenceID)
Jak sie zapewne domyslacie, jestem kompletna noga jesli chodzi o SQL. ¯_(ツ)

SELECT
IT.USER_ID
, IT.REFERENCE_ID
FROM V_INVENTORY_TRANSACTION IT
WHERE (IT.REFERENCE_ID LIKE '0355928794'
OR IT.REFERENCE_ID LIKE '0355923824')
AND IT.CODE = 'Pick'
AND IT.FROM_LOC_ID = 'CONTAINER'

Tutaj sa przykladowe dwa ordery i chcialbym otrzymac wyniki z takimi warunkami. Jest to mozliwe? ( ͡° ͜ʖ ͡°)

#sql #kiciochpyta #query
  • 16
  • Odpowiedz
@hamskloss: Tak mam timestamp dodany, teraz jednak nie potrafie uzyc tutaj MIN(), a tym bardziej tego grupowania

SELECT it.user_id
, it.reference_id
, it.from_loc_id
, to_char(cast(it.dstamp as date),'dd/mm/yyyy hh24:mi:ss') as TRAN_TIME


FROM v_inventory_transaction it
where (IT.REFERENCE_ID LIKE '0355928794'
OR IT.REFERENCE_ID LIKE '0355923824')
AND it.code = 'Pick'
AND it.FROM_LOC_ID = 'CONTAINER'

Chcialbym otrzymac pierwsza transakcje dla wartosci REFERENCE_ID. Mam wiele orderow do sprawdzenia i chcialbym wiedziec kto pierwszy wykonal konkretna akcje na
  • Odpowiedz
@dr_rip: zrób sobie tabelę pomocniczą z SELECT TransactionID, min(Timestamp) FROM X GROUP BY TransactionID i potem zrób klucz z TransactionID & min(Timestamp) (czyli masz tabelę z TransactionID i czasem pierwszej transakcji) i dojoinuj to do swojej tabeli z flagą '1' AS FlagFirstTrans, teraz wszędzie tam gdzie dojoinuje to będziesz miał 1 czyli coś w stylu:
Trans ID Timestamp User Flag
1 11/26/2020 X 1
1 11/27/2020 Y
1 11/28/2020 Z
  • Odpowiedz
coś w stylu

select
it.user_id
, it.reference_id
, it.from_loc_id
, cast(it.dstamp as date),'dd/mm/yyyy hh24:mi:ss') as TRAN_TIME
from
v_inventory_transaction it
join (
select
s.reference_id
, min(s.dstamp) as dstamp
from
v_inventory_transaction s
where
s.REFERENCE_ID in ('0355928794', '0355923824')
group by
s.reference_id
) ft
on
ft.reference_id = it.reference_id
and ft.dstamp = it.dstamp
  • Odpowiedz
via Wykop Mobilny (Android)
  • 1
@dr_rip: dla MS SQL zadziała Ci coś takiego (warto mieć indeks według zasady POC)

SELECT
IT.REFERENCE_ID,
IT2.USER_ID
FROM
V_INVENTORY_TRANSACTION IT
CROSS APPLY
(SELECT TOP 1 IT2.USER_ID FROM V_INVENTORY_TRANSACTION IT2 WHERE IT.REFERENCE_ID = IT2.REFERENCE_ID ORDER BY IT2.DSTAMP) X
WHERE
IT.CODE = 'Pick' AND IT.FROM_LOC_ID = 'CONTAINER' AND IT.REFERENCE_ID IN ('0355928794','0355923824')
  • Odpowiedz
@DarkAlchemy :
@janek_:

Dziękuje spróbuje jutro w pracy, laptop został w firmie. Czas wziąć się za naukę ( ͡° ͜ʖ ͡°) , ale dopiero teraz zaczyna mi to być potrzebne - a bardzo dobrze się bawię ucząc na przykładach. Dzięki Mirki, dam znać jutro jak spróbuje.
  • Odpowiedz
@DarkAlchemy: Miałeś na myśli zmienić w pierwszym selekcie?

SELECT
IT.REFERENCE_ID,
X.USER_ID
FROM
V_INVENTORY_TRANSACTION IT
CROSS APPLY
(SELECT TOP 1 IT2.USER_ID FROM V_INVENTORY_TRANSACTION IT2 WHERE IT.REFERENCE_ID = IT2.REFERENCE_ID ORDER BY IT2.DSTAMP) X
WHERE
IT.CODE = 'Pick' AND IT.FROM_LOC_ID = 'CONTAINER' AND IT.REFERENCE_ID IN ('0355928794','0355923824')

Jeśli tak, to wywala błąd:

ORA-00923: FROM keyword not found where expected
  • Odpowiedz
@DarkAlchemy: Tak przez ROWNUM

SELECT
IT.REFERENCE_ID,
IT.CODE,
x.USER_ID
FROM
V_INVENTORY_TRANSACTION IT
CROSS APPLY
(SELECT IT2.USER_ID FROM V_INVENTORY_TRANSACTION IT2 WHERE IT.REFERENCE_ID = IT2.REFERENCE_ID AND IT2.CODE = 'Pick' AND IT2.FROM_LOC_ID = 'CONTAINER' AND ROWNUM = 1 ORDER BY IT2.DSTAMP) X
WHERE
IT.CODE = 'Pick' AND IT.FROM_LOC_ID = 'CONTAINER' AND IT.REFERENCE_ID IN ('0355928794','0355923824')

Bez IT2 CODE i IT2 FROM LOC ID, pokazuje uzytkownika z pierwszego recordu czyli Allocation, a nie Pick.

Jednak wyniki to
drrip - @DarkAlchemy: Tak przez ROWNUM

SELECT
IT.REFERENCEID,
IT.CODE,
x.USERID...

źródło: comment_1606467492WbnyWFvhwWIrQbUSgQWzc2.jpg

Pobierz
  • Odpowiedz
via Wykop Mobilny (Android)
  • 1
@dr_rip: dodaj do tego SELECT w nawiasie CROSS APPLY IT2.DSTAMP i potem w WHERE na dole dopisz AND IT.DSTAMP = X.DSTAMP

I wtedy wywal ROWNUM na końcu zapytania :)
  • Odpowiedz
@DarkAlchemy: Siemanko, nie wiem czy masz czas ale moze moglbys pomoc? Cos sie popsulo ( ͡° ʖ̯ ͡°)

SELECT
IT.REFERENCE_ID,
X.USER_ID,
TO_CHAR(CAST(X.DSTAMP AS DATE), 'YYYY-MM-DD HH24:MI:SS') AS PICK_DATE,
IT.CODE
FROM
V_INVENTORY_TRANSACTION IT
CROSS APPLY
(SELECT IT2.USER_ID, IT2.DSTAMP FROM V_INVENTORY_TRANSACTION IT2 WHERE IT.REFERENCE_ID = IT2.REFERENCE_ID AND IT2.CODE = 'Pick' AND IT2.TO_LOC_ID = 'CONTAINER' AND ROWNUM = 1 ORDER BY IT2.DSTAMP) X
WHERE IT.REFERENCE_ID IN ('0368792539'
)
AND IT.CODE
  • Odpowiedz