Reputation: 33
I have a use case like
a 3
a 4
a 5
a 6
a 5
b 3
b 5
b 3
how to get the output like
a 4
a 5
b 5
b 3
choose the hight number for a and b, but just 2 rows
that's the query I wrote now, seems it is not working
SELECT id, barcode, actualsku, inventorycount
FROM ( SELECT pallet.id AS id,
pallet.barcode AS barcode,
inventoryunit.sku AS actualsku,
Count(inventoryunit.id) AS inventorycount
FROM (SELECT *
FROM mft.asset
WHERE container_type = 'PALLET'
AND location_type = 'PRIME' :: mft.location_type
AND is_deleted = FALSE
AND ( attributes ->> 'sku' :: text ) IS NOT NULL) pallet
LEFT OUTER JOIN (SELECT *
FROM mft.asset
WHERE asset_type = 'INVENTORYUNIT' :: mft.asset_type
AND is_deleted = FALSE) inventoryunit
ON pallet.id = inventoryunit.parent_id
GROUP BY inventoryunit.sku,
pallet.id,
pallet.barcode,
pallet.attributes ) test
WHERE (SELECT COUNT(*) FROM test as t
WHERE t.actualsku = test.actualsku
AND t.inventorycount <= test.inventorycount
) <= 2
Upvotes: 0
Views: 95
Reputation:
This is typically done using window functions:
select col1, col2
from (
select col1, col2,
row_number() over (partition by col1 order by col2 desc) as rnk
from the_table
) t
where rnk <= 2
order by col1, col2;
Online example: http://rextester.com/WKLTSB43296
Upvotes: 1