0

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
6

1 Answer 1

1

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

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.