开发者

SQL return max value from child for each parent row

开发者 https://www.devze.com 2023-04-09 23:51 出处:网络
I have 2 tables - 1 with parent records, 1 with child records.For each parent record, I\'m trying to return a single child record with the MAX(SalesPriceEach).

I have 2 tables - 1 with parent records, 1 with child records. For each parent record, I'm trying to return a single child record with the MAX(SalesPriceEach).

Additionally I'd like to only return a value when there is more than 1 child record.

parent - SalesTransactions table:
+-------------------+---------+
|SalesTransaction_ID|   text  |
+-------------------+---------+
| 1                 |  Blah   |
| 2                 |  Blah2  |
| 3                 |  Blah3  |
+-------------------+---------+

child - SalesTransactionLines table 
+--+-------------------+--------开发者_运维技巧-+--------------+
|id|SalesTransaction_ID|StockCode|SalesPriceEach|
+--+-------------------+---------+--------------+
| 1|   1               |  123    | 99           |
| 2|   1               |   35    | 50           |
| 3|   2               |   15    | 75           |
+--+-------------------+---------+--------------+


 desired results
+-------------------+---------+--------------+
|SalesTransaction_ID|StockCode|SalesPriceEach|
+-------------------+---------+--------------+
|   1               |  123    | 99           |
|   2               |   15    | 75           |
+-------------------+---------+--------------+

I found a very similar question here, and based my query on the answer but am not seeing the results I expect.

WITH max_feature AS (
   SELECT c.StockCode,
          c.SalesTransaction_ID,
          MAX(c.SalesPriceEach)  as feature
     FROM SalesTransactionLines c
 GROUP BY c.StockCode, c.SalesTransaction_ID)
   SELECT p.SalesTransaction_ID,
          mf.StockCode,
          mf.feature
     FROM SalesTransactions p
LEFT JOIN max_feature mf ON mf.SalesTransaction_ID = p.SalesTransaction_ID

The results from this query are returning multiple rows for each parent, and not even the highest value first!


select stl.SalesTransaction_ID, stl.StockCode, ss.MaxSalesPriceEach
from SalesTransactionLines stl
inner join 
(
    select stl2.SalesTransaction_ID, max(stl2.SalesPriceEach) MaxSalesPriceEach
    from SalesTransactionLines stl2 
    group by stl2.SalesTransaction_ID
    having count(*) > 1
) ss on (ss.SalesTransaction_ID = stl.SalesTransaction_ID and 
         ss.MaxSalesPriceEach = stl.SalesPriceEach)

OR, alternatively:

SELECT stl1.*
FROM SalesTransactionLines AS stl1
LEFT OUTER JOIN SalesTransactionLines AS stl2
ON (stl1.SalesTransaction_ID = stl2.SalesTransaction_ID 
    AND stl1.SalesPriceEach < stl2.SalesPriceEach)
WHERE stl2.SalesPriceEach IS NULL;


I know I'm a year late to this party but I always prefer using Row_Number in these situations. It solves the problem when there are two rows that meet your Max criteria and makes sure that only one row is returned:

with z as (
select 
    st.SalesTransaction_ID
    ,row=ROW_NUMBER() OVER(PARTITION BY st.SalesTransaction_ID ORDER BY stl.SalesPriceEach DESC)
    ,stl.StockCode
    ,stl.SalesPriceEach
from 
    SalesTransactions st
    inner join SalesTransactionLines stl on stl.SalesTransaction_ID = st.SalesTransaction_ID
)
select * from z where row = 1   


SELECT SalesTransactions.SalesTransaction_ID, 
       SalesTransactionLines.StockCode, 
       MAX(SalesTransactionLines.SalesPriceEach) 
FROM  SalesTransactions RIGHT JOIN SalesTransactionLines 
      ON SalesTransactions.SalesTransaction_ID = SalesTransactionLines.SalesTransaction_ID 
GROUP BY SalesTransactions.SalesTransaction_ID, alesTransactionLines.StockCode;


select a.SalesTransaction_ID, a.StockCode, a.SalesPriceEach
from SalesTransacions as a 
  inner join (select SalesTransaction_ID, MAX(SalesPriceEach) as SalesPriceEach  
              from SalesTransactionLines group by SalesTransaction_ID) as b
    on a.SalesTransaction_ID = b.SalesTransaction_ID 
       and a.SalesPriceEach = b.SalesPriceEach

subquery returns table with trans ids and their maximums so just join it with transactions table itself by those 2 values

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号