2.3 Getting record(s) containing the max/min value
Find the order record containing the largest amount:
SQL
WITH m AS (
SELECT max(Amount) mta
FROM Orders
WHERE OrderDate>='2022-01-01')
SELECT Orders.CustomerID,OrderDate,Amount,
Quantity, EmployeeID,EmployeeName,ShipVia
FROM m,Orders
WHERE m.mta=Orders.Amount and OrderDate>='2022-01-01'
SPL
A | |
---|---|
1 | >st=date(“2022-01-01”), start=days@o(st) |
2 | =file(“Orders.ctx”).open().cursor@x(;OrderDate>=start) |
3 | =A2.total(maxp@a(Amount)) |
A3 maxp@a(Amount) gets all records containing the largest Amount value. It is possible that there are multiple eligible order records, and @a option enables getting them all to return.
Find the last order each salesperson signs:
SQL
WITH m AS (
SELECT EmployeeID,max(OrderDate) md
FROM Orders
WHERE Amount>1000
GROUP BY EmployeeID)
SELECT Orders.CustomerID,OrderDate,Amount,
Quantity, Orders.EmployeeID,EmployeeName,ShipVia
FROM m, Orders
WHERE m.EmployeeID =Orders.EmployeeID and m.md=Orders.OrderDate and Amount>1000
SPL
A | |
---|---|
1 | =file(“Orders.ctx”).open().cursor@x(;Amount>1000) |
2 | =A1.groups(EmployeeID; maxp(OrderDate)).(#2) |
3 | =A2.run(OrderDate=date@o(OrderDate)) |
A2 Here we assume that the last order each salesperson signs is unique, and do not add the @a option but just use maxp to return the single record containing the maximum value.
We can also use top function to get the target record:
A | |
---|---|
2 | =A1.groups(EmployeeID; top@1(1;-OrderDate)).(#2) |
A2 top@1(1;-OrderDate) gets the record containing the largest OrderDate value. Without the negative sign the function gets the record containing the smallest OrderDate value.
SPL Official Website 👉 https://www.scudata.com
SPL Feedback and Help 👉 https://www.reddit.com/r/esProcSPL
SPL Learning Material 👉 https://c.scudata.com
SPL Source Code and Package 👉 https://github.com/SPLWare/esProc
Discord 👉 https://discord.gg/cFTcUNs7
Youtube 👉 https://www.youtube.com/@esProc_SPL