Re: [SQL ] 怎麼求最大值/最小值?
create table test(PartID varchar(20) null,
DMC INT NULL,
DMCL INT NULL,
QC INT NULL,
VDATE DATETIME NULL)
INSERT INTO test
values('A-120',12,100,10,'2008/1/1')
GO
INSERT INTO test
values('A-120',10,100,10,'2008/2/28')
GO
INSERT INTO test
values('A-120',10,150,18,'2008/5/2')
go
INSERT INTO test
values('A-120',10,150,18,'2008/5/3')
GO
INSERT INTO test
values('B-002',3,4,8,'2008/2/2')
GO
INSERT INTO test
values('B-002',3,5,5,'2008/5/5')
GO
INSERT INTO test
values('B-002',6,1,1,'2008/5/5')
create table #test(PartID varchar(20) null,
DMC INT NULL,
DMCL INT NULL,
QC INT NULL,
)
INSERT INTO #test
select
PartID,
DMC=MAX(DMC),
DMCL=MAX(DMCL),
QC=MAX(QC)
from test
group by PartID
select
a.PartID,
a.DMC,
VDATE=MIN(b.VDATE),
a.DMCL,
VDATE=MIN(c.VDATE),
a.QC,
VDATE=MIN(d.VDATE)
from
((#test a join test b
on a.PartID=b.PartID
and a.DMC=b.DMC) join test c
on a.PartID=c.PartID
and a.DMCL=c.DMCL) join test d
on a.PartID=d.PartID
and a.QC=d.QC
GROUP BY
a.PartID,
a.DMC,
a.DMCL,
a.QC
drop table #test
drop table test
假設擔心效率的話,
是可以寫成stored procedure..
拆開來做,
另外,我前輩說join的效率會比巢狀式查詢快..
這點倒是沒測過..
※ 引述《grence (多想兩分鐘 = =")》之銘言:
: 想像錯誤,我JOIN不出來…囧rz
: DECLARE @T TABLE(PARTID CHAR(5),DMC INT, DMLC INT, OC INT, VDATE CHAR(12))
: INSERT @T VALUES('A-120',12,100,10,'20080101')
: INSERT @T VALUES('A-120',10,100,10,'20080228')
: INSERT @T VALUES('A-120',12,150,10,'20080501')
: INSERT @T VALUES('A-120',10,100,18,'20080602')
: INSERT @T VALUES('B-002',3,4,8,'20080202')
: INSERT @T VALUES('B-002',3,5,5,'20080505')
: INSERT @T VALUES('B-002',6,1,1,'20080505')
: --SELECT * FROM @T
: ;WITH A AS(
: SELECT PARTID,MAX(DMC)DMC,MAX(DMLC)DMLC,MAX(OC)OC
: FROM @T
: GROUP BY PARTID
: )
: SELECT *
: ,(SELECT MIN(VDATE) FROM @T WHERE PARTID+str(DMC)=A.PARTID+str(A.DMC))DMCDATE
: ,(SELECT MIN(VDATE) FROM @T WHERE
: PARTID+str(DMLC)=A.PARTID+str(A.DMLC))DMLCDATE
: ,(SELECT MIN(VDATE) FROM @T WHERE PARTID+str(OC)=A.PARTID+str(A.OC))OCDATE
: FROM A
: /*
: PARTID+str(DMC)=A.PARTID+str(A.DMC)這段如果有key就用key會比較好
: 整個寫法沒啥特別的,效率感覺也不好…
: */
: ※ 引述《mindscold (Minds)》之銘言:
: : 請問我有一張表格如下:
: : TableA
: : PartID DMC DMLC OC VDate
: : ===================================
: : A-120 12 100 10 2008/1/1
: : A-120 10 100 10 2008/2/28
: : A-120 10 150 10 2008/5/1
: : A-120 10 100 18 2008/6/2
: : B-002 3 4 8 2008/2/2
: : B-002 3 5 5 2008/5/5
: : B-002 6 1 1 2008/5/5
: : :
: : :
: : ===================================
: : 我希望能找出單一PartID中,DMC、DMLC、OC最大的值,與該值座落的日期,也就是像下
: : 面的:
: : View
: : PartID DMC DMCDate DMLC DMLCDate OC OCDate
: : ================================================
: : A-120 12 2008/1/1 150 2008/5/1 18 2008/6/2
: : B-002 6 2008/5/5 5 2008/5/5 8 2008/2/2
: : :
: : :
: : ==================================================
: : ↑像這樣子的。本來是想用Group by PartID後,去各別找出MAX(DMC)、MAX(DMLC)、
: : MAX(OC)後join起來,可是想想這樣豈不是落落長、且總覺得好像效率不高,想想問版眾
: : 有沒有更好的方法呢?謝謝
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.169.97.47
※ 編輯: eggeggss 來自: 118.169.97.47 (01/01 03:57)
※ 編輯: eggeggss 來自: 118.169.97.47 (01/01 04:04)
※ 編輯: eggeggss 來自: 118.169.97.47 (01/01 04:07)
※ 編輯: eggeggss 來自: 118.169.97.47 (01/01 04:09)
討論串 (同標題文章)