作者eggeggss (忙忙忙)
看板Database
标题Re: [SQL ] 怎麽求最大值/最小值?
时间Thu Jan 1 03:56:43 2009
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)