简体   繁体   English

SQL为每个父行返回子项的最大值

[英]SQL return max value from child for each parent row

I have 2 tables - 1 with parent records, 1 with child records. 我有2个表 - 1个有父记录,1个有子记录。 For each parent record, I'm trying to return a single child record with the MAX(SalesPriceEach). 对于每个父记录,我正在尝试使用MAX(SalesPriceEach)返回单个子记录。

Additionally I'd like to only return a value when there is more than 1 child record. 另外,我只想在有超过1个子记录时返回一个值。

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! 此查询的结果为每个父级返回多行,甚至不是最高值!

I know I'm a year late to this party but I always prefer using Row_Number in these situations. 我知道我参加这个派对已经晚了一年,但我总是喜欢在这些情况下使用Row_Number。 It solves the problem when there are two rows that meet your Max criteria and makes sure that only one row is returned: 当有两行符合您的Max条件并确保只返回一行时,它解决了这个问题:

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 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;
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 子查询返回带有trans ID及其最大值的表,因此只需将这两个值与事务表本身连接起来即可

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM