Sql查询在某些规则上获取值

时间:2014-03-20 13:40:51

标签: sql rank

我有点陷入一个看似简单的问题。有人可以帮我这个吗? 实际表有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

有人可以为我写这个查询吗?

3 个答案:

答案 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示例