SQL to the rescue.

JPV

Crew Member
Crowdfunder FE
NAMEDATECATAMOUNT
Jeroen1/1/2022A20
Jeroen1/2/2022B30
Piet1/1/2021C40
Piet1/3/2022B20


Ik heb een tabellekesprobleem. Van bovenstaande tabel zou ik dit moeten maken:

Jeroen1/2/2022B30
Piet1/3/2022B20

Ik wil dus van elke NAME de maximale DATE en daar dan de CAT en AMOUNT van krijgen

Kan iemand dat?

Bonuspunten: indien iemand op dezelfde dag 2 CAT/AMOUNT combinaties heeft, zouden die allemaal getoond mogen worden.

Wie kan me hierbij helpen? Ik kan de eerste 2 rijen maken, maar gegevens opzoeken van een combinatie van 2 kolommen lukt me normaal altijd door excel te gebruiken. maar aangezien het hier over 91 miljoen records die ik moet reduceren naar 800.000, lukt dit niet met excel ;).
 
SELECT Name, MAX(Date), Cat, Amount FROM tabel
GROUP BY Name
Denk ik dat zou moeten werken?

Ivm je bonus snap ik het niet goed. Als iemand dus 2 of meer records heeft waar de date, cat en amount hetzelfde zijn zouden die allen getoond moeten worden als aparte records?
Zijn dit de enige velden in de tabel of heb je ook een uniek ID per record?
 
  • Leuk
Waarderingen: JPV
Ik ben alleen MSSQL gewend, dus mogelijks nog aan te passen aan het dialect waarin je werkt.

SELECT Name, max(date), cat, amount
FROM Tabel
GROUP BY Name

tweede query mogelijks:
SELECT Name, max(date), cat, amount
FROM Tabel
GROUP BY Name, cat
HAVING date = max(date)
 
  • Leuk
Waarderingen: JPV
Als je group by doet, moet je alle kolommen in de group by opnemen, die in de select staan.
Buiten de kolom waarop je een group functie toepast. Anders krijg je een fout.

Dit werkt:
select name, date, cat, amount
from tabel A
where exists
(select name, date
from (select name, max(Date) date
from tabel B
GROUP BY Name) C
where A.name = C.name
and A.date = C.date
);

OF

select name, date, cat, amount
from tabel A
where name || date in
(select name || max(Date)
from tabel B
GROUP BY Name
);

|| is concatenate


De bonusvraag wordt hier trouwens mee opgelost.
Die komen er mee uit.

Zit je met effectieve dubbels op dezelfde max(Date), kan je er nog select distinct... van maken.
 
Laatst bewerkt:
  • Leuk
Waarderingen: JPV
SELECT Name, MAX(Date), Cat, Amount FROM tabel
GROUP BY Name
Denk ik dat zou moeten werken?

Ivm je bonus snap ik het niet goed. Als iemand dus 2 of meer records heeft waar de date, cat en amount hetzelfde zijn zouden die allen getoond moeten worden als aparte records?
Zijn dit de enige velden in de tabel of heb je ook een uniek ID per record?
IVM de bonus: als date en naam hetzelfde zijn, zouden alle cat en amounts getoond moeten worden (met dan natuurlijk ook de naam en date). Er is een uniek nummer, ja.
 
IVM de bonus: als date en naam hetzelfde zijn, zouden alle cat en amounts getoond moeten worden (met dan natuurlijk ook de naam en date). Er is een uniek nummer, ja.
Group by Name, Date, Cat zou moeten werken dan denk ik, maar eerlijk gezegd niet zeker van.
 
NAMEDATECATAMOUNT
Jeroen1/1/2022A20
Jeroen1/2/2022B30
Piet1/1/2021C40
Piet1/3/2022B20


Ik heb een tabellekesprobleem. Van bovenstaande tabel zou ik dit moeten maken:

Jeroen1/2/2022B30
Piet1/3/2022B20

Ik wil dus van elke NAME de maximale DATE en daar dan de CAT en AMOUNT van krijgen

Kan iemand dat?

Bonuspunten: indien iemand op dezelfde dag 2 CAT/AMOUNT combinaties heeft, zouden die allemaal getoond mogen worden.

Wie kan me hierbij helpen? Ik kan de eerste 2 rijen maken, maar gegevens opzoeken van een combinatie van 2 kolommen lukt me normaal altijd door excel te gebruiken. maar aangezien het hier over 91 miljoen records die ik moet reduceren naar 800.000, lukt dit niet met excel ;).
Welke database gebruik je?
Is van belang om te weten welke functies beschikbaar zijn ;)

De query van @oldschooler zou wel moeten werken. Maar het kan eventueel simpeler.
 
Als je group by doet, moet je alle kolommen in de group by opnemen, die in de select staan.
Buiten de kolom waarop je een group functie toepast. Anders krijg je een fout.

Dit werkt:
select name, date, cat, amount
from tabel A
where exists
(select name, date
from (select name, max(Date) date
from tabel B
GROUP BY Name) C
where A.name = C.name
and A.date = C.date
);

OF

select name, date, cat, amount
from tabel A
where name || date in
(select name || max(Date)
from tabel B
GROUP BY Name
);

|| is concatenate


De bonusvraag wordt hier trouwens mee opgelost.
Die komen er mee uit.

Zit je met effectieve dubbels op dezelfde max(Date), kan je er nog select distinct... van maken.

Ik gebruik nu even deze oplossingen, maar Tabel B, wat zou dat moeten zijn? Er is maar 1 tabel die ik gebruik, hé.
Welke database gebruik je?
Is van belang om te weten welke functies beschikbaar zijn ;)

De query van @oldschooler zou wel moeten werken. Maar het kan eventueel simpeler.
DB2

Nog even verduidelijken: dit is de enige tabel die ik heb (allez, heb er nog wel en zal daar dan nog een JOIN functie opmoeten doen, maar dat kan ik):

NameDateCatAmount
Jan
1/01/2022​
A
20​
Jan
1/02/2022​
B
1​
Jan
1/03/2022​
C
1​
Jan
1/04/2022​
D
3​
Jan
1/05/2022​
A
2​
Jan
1/05/2022​
D
4​
Jan
1/06/2022​
E
2​
Piet
1/01/2022​
A
5​
Piet
1/01/2022​
A
1​
Piet
1/01/2022​
A
3​
Piet
1/02/2022​
B
5​
piet
1/02/2022​
C
4​

Het resultaat van de query met bonusvraag zou moeten zijn dat ik van élke persoon ALLE Cat's en Amount's van de hoogste overhoudt, dus dit:

NameDateCatAmount
Jan
1/06/2022​
E
2​
Piet
1/02/2022​
B
5​
piet
1/02/2022​
C
4​
 
Ik gebruik nu even deze oplossingen, maar Tabel B, wat zou dat moeten zijn? Er is maar 1 tabel die ik gebruik, hé.

DB2

Nog even verduidelijken: dit is de enige tabel die ik heb (allez, heb er nog wel en zal daar dan nog een JOIN functie opmoeten doen, maar dat kan ik):

NameDateCatAmount
Jan
1/01/2022​
A
20​
Jan
1/02/2022​
B
1​
Jan
1/03/2022​
C
1​
Jan
1/04/2022​
D
3​
Jan
1/05/2022​
A
2​
Jan
1/05/2022​
D
4​
Jan
1/06/2022​
E
2​
Piet
1/01/2022​
A
5​
Piet
1/01/2022​
A
1​
Piet
1/01/2022​
A
3​
Piet
1/02/2022​
B
5​
piet
1/02/2022​
C
4​

Het resultaat van de query met bonusvraag zou moeten zijn dat ik van élke persoon ALLE Cat's en Amount's van de hoogste overhoudt, dus dit:

NameDateCatAmount
Jan
1/06/2022​
E
2​
Piet
1/02/2022​
B
5​
piet
1/02/2022​
C
4​
A en B zijn alias voor "tabel".
 
Ik zit op gsm, maar ik zou eens proberen:
Select name, date, cat, amount
From table
Where date = max(date) over (partition by name)
 
Je kan dezelfde tabel meermaals gebruiken in een query, je maakt het onderscheid via aliassen.

select Name, Date, Cat, Amount
from Table A
where Name || Date in
(select Name || max(Date)
from Table B
GROUP BY Name
);

SQL State: 42815
Vendor Code: -171
Message: [SQL0171] Argument 2 of function CONCAT not valid. Cause . . . . . : The data type, length, or value of argument 2 of function CONCAT specified is not valid. Recovery . . . : Refer to the DB2 for IBM i SQL Reference topic collection in the Database category in the IBM i Information Center for more information on scalar functions. Correct the arguments specified for the function. Try the request again.
ping_error.gif
Processing ended because the highlighted statement did not complete successfully
 
Ik zit op gsm, maar ik zou eens proberen:
Select name, date, cat, amount
From table
Where date = max(date) over (partition by name)

[ Sun Apr 10 10:10:58 CEST 2022 ] Run All...

SQL State: 42601
Vendor Code: -199
Message: [SQL0199] Keyword OVER not expected. Valid tokens: FOR USE SKIP WAIT WITH FETCH LIMIT ORDER UNION EXCEPT OFFSET. Cause . . . . . : The keyword OVER was not expected here. A syntax error was detected at keyword OVER. The partial list of valid tokens is FOR USE SKIP WAIT WITH FETCH LIMIT ORDER UNION EXCEPT OFFSET. This list assumes that the statement is correct up to the unexpected keyword. The error may be earlier in the statement but the syntax of the statement seems to be valid up to this point. Recovery . . . : Examine the SQL statement in the area of the specified keyword. A colon or SQL delimiter may be missing. SQL requires reserved words to be delimited when they are used as a name. Correct the SQL statement and try the request again.
Processing ended because the highlighted statement did not complete successfully

Failed statements: 1
 
[ Sun Apr 10 10:10:58 CEST 2022 ] Run All...

SQL State: 42601
Vendor Code: -199
Message: [SQL0199] Keyword OVER not expected. Valid tokens: FOR USE SKIP WAIT WITH FETCH LIMIT ORDER UNION EXCEPT OFFSET. Cause . . . . . : The keyword OVER was not expected here. A syntax error was detected at keyword OVER. The partial list of valid tokens is FOR USE SKIP WAIT WITH FETCH LIMIT ORDER UNION EXCEPT OFFSET. This list assumes that the statement is correct up to the unexpected keyword. The error may be earlier in the statement but the syntax of the statement seems to be valid up to this point. Recovery . . . : Examine the SQL statement in the area of the specified keyword. A colon or SQL delimiter may be missing. SQL requires reserved words to be delimited when they are used as a name. Correct the SQL statement and try the request again.
Processing ended because the highlighted statement did not complete successfully

Failed statements: 1
Dan ondersteunt uw db2 geen window functions precies :p
 
select Name, Date, Cat, Amount
from Table A
where Name || Date in
(select Name || max(Date)
from Table B
GROUP BY Name
);

SQL State: 42815
Vendor Code: -171
Message: [SQL0171] Argument 2 of function CONCAT not valid. Cause . . . . . : The data type, length, or value of argument 2 of function CONCAT specified is not valid. Recovery . . . : Refer to the DB2 for IBM i SQL Reference topic collection in the Database category in the IBM i Information Center for more information on scalar functions. Correct the arguments specified for the function. Try the request again.
ping_error.gif
Processing ended because the highlighted statement did not complete successfully
Wsl kan db2 niet meteen een tekst en date concateneren.
(Bij postgres gaat dat bv. wel.

Dus de date eerst omzetten naar een tekst.

VARCHAR_FORMAT(current_timestamp,'YYYYMMDD')
uit


Dus hopelijk:

select Name, Date, Cat, Amount
from Table A
where Name || VARCHAR_FORMAT(Date,'YYYYMMDD') in
(select Name || VARCHAR_FORMAT(max(Date),'YYYYMMDD')
from Table B
GROUP BY Name
);

Als || niet wordt herkend.
Dan concat proberen.
concat (Name , VARCHAR_FORMAT(Date,'YYYYMMDD'))
 
Wsl kan db2 niet meteen een tekst en date concateneren.
(Bij postgres gaat dat bv. wel.

Dus de date eerst omzetten naar een tekst.

VARCHAR_FORMAT(current_timestamp,'YYYYMMDD')
uit


Dus hopelijk:

select Name, Date, Cat, Amount
from Table A
where Name || VARCHAR_FORMAT(Date,'YYYYMMDD') in
(select Name || VARCHAR_FORMAT(max(Date),'YYYYMMDD')
from Table B
GROUP BY Name
);

Als || niet wordt herkend.
Dan concat proberen.
concat (Name , VARCHAR_FORMAT(Date,'YYYYMMDD'))
werkt jammer genoeg niet :(

select Name, Date, Cat, Amount
from Table
where Name || VARCHAR_FORMAT( Date ,'YYYYMMDD') in
(select Name || VARCHAR_FORMAT( Date ,'YYYYMMDD')
from tabel B
GROUP BY Name
);

Vendor Code: -171 Message: [SQL0171] Argument 1 of function VARCHAR_FORMAT not valid. Cause . . . . . : The data type, length, or value of argument 1 of function VARCHAR_FORMAT specified is not valid. Recovery . . . : Refer to the DB2 for IBM i SQL Reference topic collection in the Database category in the IBM i Information Center for more information on scalar functions. Correct the arguments specified for the function. Try the request again. Processing ended because the highlighted statement did not complete successfully Failed statements: 1

Het lijkt nochtans correct wat ik doe...

Date is effectief van het "date" format.
 
werkt jammer genoeg niet :(

select Name, Date, Cat, Amount
from Table
where Name || VARCHAR_FORMAT( Date ,'YYYYMMDD') in
(select Name || VARCHAR_FORMAT( Date ,'YYYYMMDD')
from tabel B
GROUP BY Name
);

Vendor Code: -171 Message: [SQL0171] Argument 1 of function VARCHAR_FORMAT not valid. Cause . . . . . : The data type, length, or value of argument 1 of function VARCHAR_FORMAT specified is not valid. Recovery . . . : Refer to the DB2 for IBM i SQL Reference topic collection in the Database category in the IBM i Information Center for more information on scalar functions. Correct the arguments specified for the function. Try the request again. Processing ended because the highlighted statement did not complete successfully Failed statements: 1

Het lijkt nochtans correct wat ik doe...

Date is effectief van het "date" format.
hmm, en dit:

select Name, Date, Cat, Amount
from tabel A
where Name || VARCHAR_FORMAT( TIMESTAMP(Date) ,'YYYYMMDD') in
(select Name || VARCHAR_FORMAT( TIMESTAMP(max(Date)) ,'YYYYMMDD')
from tabel B
GROUP BY Name
);

(Je hebt ook de max() laten vallen.)
 
Laatst bewerkt:
  • Leuk
Waarderingen: JPV
Terug
Bovenaan