表格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
答案 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只会得到一个结果。