作者criky (学习中)
看板Database
标题Re: [SQL ] 在Group by中取得首笔资料
时间Mon Jul 24 21:36:58 2017
※ 引述《SangoGO (隐世的外来人Lv.1)》之铭言:
: 资料库名称:MS SQL
: 资料库版本:2012
: 内容/问题描述:
: 各位先进好
: 自己在公司专案的开发上碰到了查询上的难题
: 如下图范例所示
: http://i.imgur.com/mL6ulEi.png
: 左边是原始Insert的资料
: 中间是依照TYPE与DATE排序的结果
: 右边为预期产出
: 用Group by能直接算出各TYPE的AMT和
: 但旁边的DATE与VALUE就缺乏有效的取得方法
: 有试过用子查询去抓
: 但因为实际笔数过大(可能有100,000)而速度缓慢
: 又或者让结果去找原表,每笔0.1秒的话,6000笔就要10分钟了
: 是否有更好解决的方法呢,求各位先进开示了
: -----
: Sent from JPTT on my Sony E6853.
用2个查询可以做,
若有大大知道更简洁的语法也请分享一下~
create table table_A
(
type1 varchar(10),
amt integer,
date1 date,
extend_value varchar(10)
);
insert into table_A (type1,amt,date1,extend_value)
values
('A' , 600 , '20170703' , '07001-2') ,
('A' , 700 , '20170701' , '07001-8') ,
('B' , 500 , '20170704' , '07001-21') ,
('B' , 1100, '20170705' , '07001-17') ,
('C' , 700 , '20170713' , '07001-9') ,
('C' , 800 , '20170714' , '07001-6') ,
('D' , 600 , '20170706' , '07001-13') ,
('D' , 500 , '20170707' , '07001-18')
;
select b.type1,a.amt,b.date1,b.extend_value from
(
select type1,amt,date1,extend_value,
ROW_NUMBER() OVER (partition by type1 ORDER BY type1,date1) N
from table_A
) b
left join
(select type1,sum(amt) as amt
from table_A
group by type1
) a
on a.type1=b.type1
where b.N=1
output
type1 amt date1 extend_value
A 1300 2017-07-01 07001-8
B 1600 2017-07-04 07001-21
C 1500 2017-07-13 07001-9
D 1100 2017-07-06 07001-13
手机编辑有点难弄,若格式跑掉晚上再整理文章,
後来想到应该不用row number也可以做
select b.type1,a.amt,b.date1,b.extend_value
from table_A b
inner join
(
select type1,sum(amt) as amt ,MIN(DATE1) date1
from table_A
group by type1
) a
on a.type1=b.type1
AND a.date1=b.date1
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 27.147.29.46
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Database/M.1500903422.A.373.html
※ 编辑: criky (27.147.29.46), 07/24/2017 21:40:20
※ 编辑: criky (180.217.130.233), 07/25/2017 09:29:03
※ 编辑: criky (180.217.130.233), 07/25/2017 09:30:28