使用CTE查询

以下是我在csdn的sql server版提问的问题,以及得到的回答

数据库是sql server express 2005的;

表名是table1;
表的结构:productid(产品代码)、price(价格)、discount(折扣)、supplyid(供应商代码)
主键是productid+supplyid

表的内容:
productid price discount supplyid
0001 0.5 0.02 1
0001 0.4 0.03 2
0001 0.4 0.01 3
0002 1 0 1
0002 0.8 0 2
0002 0.9 0 3
0003 0.8 0.02 1
0003 0.7 0.01 2
0003 0.8 0.03 3


无论纪录有多少条,supplyid只有3个,即为1,2,3
productid可能有很多,上面的只是例子
寻找一条sql查询语句,要求:
查出每一个productid,discount最小的那一行,对于每个productid,只给出合适的一条纪录
上面那表查询的结果应该为(对于discount一样的,给出任一行就行了)
0001 0.4 0.01 3
0002 1 0 1
0003 0.4 0.01 3

create table table1
(productid
varchar(10), price float, discount float, supplyid int)

insert table1
select '0001', 0.5, 0.02, 1
union all select '0001', 0.4, 0.03, 2
union all select '0001', 0.4, 0.01, 3
union all select '0002', 1, 0, 1
union all select '0002', 0.8, 0, 2
union all select '0002', 0.9, 0, 3
union all select '0003', 0.8, 0.02, 1
union all select '0003', 0.7, 0.01, 2
union all select '0003', 0.8, 0.03, 3

With cte
AS
(
select row_number() over (order by productid, discount) as rowid, productid, price, discount, supplyid
from table1)

select c.productid, c.price, c.discount, c.supplyid from cte c
JOIN
(
select productid, min(rowid) as rowid from cte
group by productid
)t
ON c.productid = t.productid AND c.rowid = t.rowid

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值