如何检索每个组的最大值? - SQL

时间:2014-05-14 07:10:22

标签: sql sql-server-2008 tsql

表格tbl_products包含如下所示的数据:

Id   Name  
----------
1    P1       
2    P2       
3    P3       
4    P4       
5    P5       
6    P6       

另一个表tbl_inputs包含如下所示的数据:

Id   Product_Id   Price   Register_Date
----------------------------------------
1    1              10     2010-01-01
2    1              20     2010-10-11
3    1              30     2011-01-01
4    2              100    2010-01-01
5    2              200    2009-01-01
6    3              500    2011-01-01
7    3              270    2010-10-15
8    4              80     2010-01-01
9    4              50     2010-02-02
10   4              92     2011-01-01

我想选择每个组中包含最大日期的所有产品(ID,名称,价格,register_date)。

例如:

Id   Name   Price   Register_Date
----------------------------------------
3    P1     30     2011-01-01
4    P2     100    2010-01-01
6    P3     500    2011-01-01
10   P4     92     2011-01-01

5 个答案:

答案 0 :(得分:2)

select 
  id
  ,name
  ,code
  ,price
from tbl_products tp
cross apply (
  select top 1 price 
  from tbl_inputs ti
    where ti.product_id = tp.id
  order by register_date desc
) tii

虽然不是最佳方式,但可以这样做:

;with gb as (
  select 
    distinct
    product_id
    ,max(register_date) As max_register_date
  from tbl_inputs 
  group by product_id
)
select 
  id
  ,product_id
  ,price
  ,register_date
from tbl_inputs ti
join gb
  on ti.product_id=gb.product_id
  and ti.register_date = gb.max_register_date

但正如我先前所说的那样......在这种情况下,这不是一种方法。

答案 1 :(得分:1)

;with cte as
(
  select t1.id, t1.name, t1.code, t2.price, t2.register_date,
  row_number() over (partition by product_id order by register_date desc) rn
  from tbl_products t1
  join tbl_inputs t2
  on t1.id = t2.product_id
)
select id, name, code, price, register_date
from cte
where rn = 1

答案 2 :(得分:0)

像这样......

select id, product_id, price, max(register_date)
from tbl_inputs
group by id, product_id, price

答案 3 :(得分:0)

您可以使用max函数和group by子句。如果你只需要表tbl_inputs的结果,你甚至不需要连接     选择product_id,max(register_date),价格     来自tbl_inputs     group by product_id,price

如果您需要来自tbl_prducts的字段,则必须使用连接。

select p.name, p. code, i.id, i.price, max(i.register_date)
from tbl_products p join tbl_inputs i on p.id=i.product_id
grooup by p.name, p. code, i.id, i.price

答案 4 :(得分:0)

试试这个:

SELECT id, product_id, price, register_date
FROM tbl_inputs T1 INNER JOIN
(
    SELECT product_id, MAX(register_date) As Max_register_date
    FROM tbl_inputs 
    GROUP BY product_id
) T2 ON(T1.product_id= T2.product_id AND T1.register_date= T2.Max_register_date)

当然,这是假设您的日期是独一无二的。如果不是,则需要将DISTINCT关键字添加到外部SELECT语句中。

修改

对不起,我没有解释清楚。您的日期可以重复,只要每个产品ID都是唯一的,它就不是问题。如果每个产品ID可以有重复的日期,那么在我建议的select语句的结果中,每个产品将有多个行,并且您必须找到一种方法将每个产品减少到一行。 即: 如果你有这样的记录(当产品的最后一个日期在你的表中出现的次数超过一次时价格不同)

id  |  product_Id  |  price |  register_date
-------------------------------------------- 
1   |  1           | 10.00  | 01/01/2000
2   |  1           | 20.00  | 01/01/2000

它将导致将这两个记录作为结果。 但是,如果register_date每个产品ID 唯一,那么每个产品ID只会得到一个结果。