SQL to the rescue.

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.)
was idd die max() vergeten :)

Ik geraak al iets verder als ik er

Code:
select Name, Date, Cat, Amount
from TABLE A
where Name || VARCHAR_FORMAT(TIMESTAMP(A.Date,'YYYYMMDD')) in
(select Name || VARCHAR_FORMAT ( TIMESTAMP (MAX(Date)) ,'YYYYMMDD')
from TABLE B
GROUP BY Name
);
van maak. Dan passeert de functie A.Date, maar gaat hij bij de 2e timestamp de mist in (zelfde foutmelding:

Message: [SQL0171] Argument 1 of function TIMESTAMP not valid. Cause . . . . . : The data type, length, or value of argument 1 of function TIMESTAMP 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

Als ik die 2e DATE vervang door A.Date , B.Date of de oorspronkelijke databasenaam.Date vervang, blijft hetzelfde issue.
 
Wtf. Archaïsche db.

Zet om te proberen eens de max rond de varchar_format ipv rond de date.

Max werkt functioneel ook correct op textformaten yyyymmdd.
 
  • Leuk
Waarderingen: JPV
select Name, Date, Cat, Amount
from Table A
where Name || VARCHAR_FORMAT(TIMESTAMP(A.Date,'YYYYMMDD')) in
(select Name || MAX(VARCHAR_FORMAT(TIMESTAMP(Date,'YYYYMMDD')))
from Table B
GROUP BY Name
);

Geeft deze foutmelding:

"Vendor Code: -181 Message: [SQL0181] Value in date, time, or timestamp string not valid. Cause . . . . . : The string representation of a date, time or timestamp value is not in the acceptable range. *N is either the character string constant that is not valid or the column or host variable that contained the string. If the name is *N, then the value was found in an expression specified in the statement. If the value was found in a host variable, then the host variable number is 0. The proper ranges for date, time, or timestamp values are as follows: -- The range for years is from 0001 to 9999. For date formats *MDY, *YMD, *DMY, and *JUL, the year must be in the range 1940 to 2039. -- The range for months is from 1 to 12. -- The range for days is from 1 - 30 for April, June, September, and November, from 1 - 28 for February and from 1 to 31 for all other months. In a leap year, the range for February can be from 1 to 29. -- The range for days in a Julian date is from 001 to 366 for a leap year or 001 to 365 days for all other years. -- The range for hours is from 0 to 24. If the hour is 24, then the other parts of the time values must be zeros. If the time format is USA, then the hour cannot be greater than 12. -- The range for minutes is from 0 to 59. -- The range for seconds is from 0 to 59. -- The range for microseconds is from 0 to 999999. Recovery . . . : Ensure that the date, time, or timestamp value conforms to the ranges for the data type it represents. Try the request again."


maar...

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

Lukt !

Bedankt iedereen om te helpen zoeken :)
 
select Name, Date, Cat, Amount
from Table A
where Name || VARCHAR_FORMAT(TIMESTAMP(A.Date,'YYYYMMDD')) in
(select Name || MAX(VARCHAR_FORMAT(TIMESTAMP(Date,'YYYYMMDD')))
from Table B
GROUP BY Name
);

Geeft deze foutmelding:

"Vendor Code: -181 Message: [SQL0181] Value in date, time, or timestamp string not valid. Cause . . . . . : The string representation of a date, time or timestamp value is not in the acceptable range. *N is either the character string constant that is not valid or the column or host variable that contained the string. If the name is *N, then the value was found in an expression specified in the statement. If the value was found in a host variable, then the host variable number is 0. The proper ranges for date, time, or timestamp values are as follows: -- The range for years is from 0001 to 9999. For date formats *MDY, *YMD, *DMY, and *JUL, the year must be in the range 1940 to 2039. -- The range for months is from 1 to 12. -- The range for days is from 1 - 30 for April, June, September, and November, from 1 - 28 for February and from 1 to 31 for all other months. In a leap year, the range for February can be from 1 to 29. -- The range for days in a Julian date is from 001 to 366 for a leap year or 001 to 365 days for all other years. -- The range for hours is from 0 to 24. If the hour is 24, then the other parts of the time values must be zeros. If the time format is USA, then the hour cannot be greater than 12. -- The range for minutes is from 0 to 59. -- The range for seconds is from 0 to 59. -- The range for microseconds is from 0 to 999999. Recovery . . . : Ensure that the date, time, or timestamp value conforms to the ranges for the data type it represents. Try the request again."


maar...

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

Lukt !

Bedankt iedereen om te helpen zoeken :)
Aha.
En nu best met VARCHAR(MAX(Date)) ipv MAX(VARCHAR(Date))

Die query geeft mss geen fout, maar het resultaat is vermoedelijk niet correct.

En waarom.

Stel je hebt 2 datums. Als die standaard zo worden weergegeven:
01-01-2022
15-01-2002 (mind jaartal 2002 ipv 2022...)

Dan komt 15-01-2002 er mss uit als max resultaat, omdat 15012002 een hoger getal is dan 01012022.
En dat is dus fout.

Als je datums als tekst of nummer wilt vergelijken, moet het in het formaat yyyymmdd zijn.
20220101 is nl. groter dan 20020115.

Mss heeft die char fuctie een 2de parameter optie, en geef je dan 'yyyymmdd ' mee.
 
  • Leuk
Waarderingen: JPV
formaat in de DB is YYYYMMDD, dus het lukt goed :)
Nu eens de eerste query proberen uit:

Volgens mij werkt die even goed.

Is mss een langere constructie, maar die is mogelijk sneller.

En als het over 91 miljoen records gaat, is snelheid wel een issue.

Voor de fun eens beide draaien, en kijken welke het snelste is.
 
Nu eens de eerste query proberen uit:

Volgens mij werkt die even goed.

Is mss een langere constructie, maar die is mogelijk sneller.

En als het over 91 miljoen records gaat, is snelheid wel een issue.

Voor de fun eens beide draaien, en kijken welke het snelste is.
De laatste oplossing is in een drietal minuten klaar, de eerste is na 12 minuten nog aan het draaien.
 
De laatste oplossing is in een drietal minuten klaar, de eerste is na 12 minuten nog aan het draaien.
Raar, een exists is normaal sneller dan een in als er gezocht moet worden in grote deelverzamelingen.

Wel verbazend snel op 96 miljoen records :censored:
 
Raar, een exists is normaal sneller dan een in als er gezocht moet worden in grote deelverzamelingen.

Wel verbazend snel op 96 miljoen records :censored:
Na een uur was hij nog bezig, dus afgesloten :).

91 miljoen records btw. En gezien er een mainframe systeem van 6m op 3m op 2,5m in ons gebouw staat, kan dat wel wat aan denk ik ;) (geen idee welk type processoren). Op een zondag als niemand anders op die server zit, draait dat wel goed.
 
(slightly off topic: suggesties voor goede sql cursussen?)
 
  • Leuk
Waarderingen: JPV
Een bijkomende vraag/probleem

Ik heb nu een lijst van alle bedragen die iemand kreeg in de "laatste" maand dat ze betaald hebben via onderstaande query

Code:
select Name, Date, Cat, Amount
from Table A
where Name || VARCHAR(A.Date) in
(select Name || MAX(VARCHAR(Date))
from Table B
GROUP BY Name
);

Maar het probleem is dat het systeem bij niet-betaalde bedragen "tegenboekingen" doet. Een niet-betaalde maand krijgt dus bvb eerst een boeking van 15 euro en dan een tegenboeking van -15 euro. Met de huidige query is er echter een vermelding, ook al is de som van alle transacties voor die naam 0 euro.

Kan er iemand deze query helpen updaten om de data (maanden) te elimineren waar de som van de betalingen voor die maand 0 euro is?

ik wou iets doen met "having SUM(AMOUNT) <> '0'" , maar dat lukt niet.

(anders gezegd: ik wil van deze query voor elke naam de recentste maand

Code:
select Name, Date, Cat, SUM(Amount)
from Table A
GROUP BY Name, Date, Cat
WHERE SUM(Amount)<>'0';
 
Laatst bewerkt:
Een bijkomende vraag/probleem

Ik heb nu een lijst van alle bedragen die iemand kreeg in de "laatste" maand dat ze betaald hebben via onderstaande query

Code:
select Name, Date, Cat, Amount
from Table A
where Name || VARCHAR(A.Date) in
(select Name || MAX(VARCHAR(Date))
from Table B
GROUP BY Name
);

Maar het probleem is dat het systeem bij niet-betaalde bedragen "tegenboekingen" doet. Een niet-betaalde maand krijgt dus bvb eerst een boeking van 15 euro en dan een tegenboeking van -15 euro. Met de huidige query is er echter een vermelding, ook al is de som van alle transacties voor die naam 0 euro.

Kan er iemand deze query helpen updaten om de data (maanden) te elimineren waar de som van de betalingen voor die maand 0 euro is?

ik wou iets doen met "having SUM(AMOUNT) <> '0'" , maar dat lukt niet.

(anders gezegd: ik wil van deze query voor elke naam de recentste maand

Code:
select Name, Date, Cat, SUM(Amount)
from Table A
GROUP BY Name, Date, Cat
WHERE SUM(Amount)<>'0';
Having sum(amount) > 0

Uw 0 niet tussen ‘’ zetten, dan wordt het als alphanumeriek gezien :)
 
Terug
Bovenaan