我有点陷入一个看似简单的问题。有人可以帮我这个吗? 实际表有25列。 但基本上形成这个问题让我们说它看起来像这样:
SR | Type | Des | Code
-------------------------
1 | wo | abc | 100
-------------------------
2 | co | def | 100
-------------------------
3 | wo | ghi | 200
-------------------------
4 | co | jkl | 200
-------------------------
5 | co | mno | 200
-------------------------
我的查询应按“Code
”进行分组。 “Type
”应从第一行开始,“Des
”应从最新一组中删除。
我希望我的结果集如下:
SR | Type | Des | Code
-------------------------
1 | wo | def | 100
-------------------------
3 | wo | mno | 200
有人可以为我写这个查询吗?
答案 0 :(得分:0)
这是让你入门的东西。我确信它可以通过一些战略连接来改进(以防止必须命名每一列),但它确实有效。
DECLARE @mytable TABLE (
SR INT IDENTITY(1, 1),
Type VARCHAR(10) NOT NULL,
Des VARCHAR(10) NOT NULL,
Code INT
)
INSERT INTO @mytable (Type, Des, Code) VALUES ('wo', 'abc', 100);
INSERT INTO @mytable (Type, Des, Code) VALUES ('co', 'def', 100);
INSERT INTO @mytable (Type, Des, Code) VALUES ('wo', 'ghi', 200);
INSERT INTO @mytable (Type, Des, Code) VALUES ('co', 'jkl', 200);
INSERT INTO @mytable (Type, Des, Code) VALUES ('co', 'mno', 200);
SELECT DISTINCT (SELECT TOP 1 SR
FROM @mytable
WHERE Code = Summary.Code
ORDER BY SR ASC) AS SR,
(SELECT TOP 1 Type
FROM @mytable
WHERE Code = Summary.Code
ORDER BY SR ASC) AS Type,
(SELECT TOP 1 Des
FROM @mytable
WHERE Code = Summary.Code
ORDER BY SR DESC) AS Des,
Code
FROM @mytable Summary
答案 1 :(得分:0)
我已经查询了你的问题。 FROM子句中的Sub Query通过CODE获取分组,并确定SR的最小值和最大值。一旦我们得到了这个,我们就加入到CODE主表和minSR \ maxSR值中,得到相应的Type和Des值。这假设每个CODE将始终具有minSR和maxSR值。如果不是这种情况,请将INNER JOIN更改为Left JOINs。
请注意TABLE =上面示例表的名称。此外,结果集中SR的值是SR的最小值,如示例结果集中所示。
Select cg.CODE, tmin.Type, tmax.Des, tmin.SR
FROM (
Select CODE, Min(SR) as MinSR, MAX(SR) as MaxSR
FROM TABLE
GROUP BY CODE
) cg
INNER JOIN TABLE tmin ON cg.CODE = tmin.Code
AND cg.MinSR = tmin.SR
INNER JOIN TABLE tmax ON cg.CODE = tmax.Code
AND cg.MaxSR = tmax.SR
答案 2 :(得分:0)
以下是使用ANSI窗口函数的解决方案:
select sr,
first_type as type,
last_des as des,
code
from (
select sr,
type,
des,
code,
first_value(type) over (partition by code order by sr rows between unbounded preceding and unbounded following) as first_type,
last_value(des) over (partition by code order by sr rows between unbounded preceding and unbounded following) as last_des,
row_number() over (partition by code order by sr ) as rn
from data
) t
where rn = 1
order by sr
SQLFiddle示例