1

我对 SQL 很陌生,所以请温柔一点。我已经尝试搜索答案,但找不到任何东西。

我在表格中有以下数据

Code    Area        Department          Level    Name
HWNET   Highways    Network Services    2        Bob Jones
HWNET   Highways    Network Services    1        Jim Smith
HWTRA   Highways    Traffic Services    2        Andy Johnson
HWTRA   Highways    Traffic Services    1        David Turner

我想从表中选择所有列,但只选择每个级别的最小值。我的问题是我需要知道名称,但这阻止了我使用按功能分组

如果我使用它,它会带回表格中的每一行

SELECT Code, Area, Department,MIN(Level) Level , Name
FROM TABLE_NAME
GROUP BY Code, Area,Department, Name 

这将带回正确的行,但不包含名称。

SELECT Code, Area, Department,MIN(Level) Level
FROM TABLE_NAME
GROUP BY Code, Area,Department

有没有办法让我恢复这组结果?

Code    Area        Department          Level    Name
HWNET   Highways    Network Services    1        Jim Smith
HWTRA   Highways    Traffic Services    1        David Turner

谢谢是提前

4

4 回答 4

3
select t.* 
from TABLE_NAME t
inner join
(
  SELECT Code, Area, Department,MIN(Level) mLevel
  FROM TABLE_NAME
  GROUP BY Code, Area,Department
) x on x.Code = t.code 
    and x.Area = t.area 
    and x.Department = t.Department 
    and x.mLevel = t.level
于 2013-10-11T09:34:54.277 回答
1

通常我这样做是这样的:

select *
  from TABLE_NAME
 where (Department, 
        Level) in (select Department,
                          min(Level)
                     from TABLE_NAME
                 group by Department)

这是SQL Fiddle 中的演示

根据您的数据,我只使用了 Department 和 Level,但如果您还需要使用 Code 和 Area 来识别正确的行,只需在 WHERE 子句和子查询的 SELECT 中对它们进行 ass。

select *
  from TABLE_NAME
 where (Code,
        Area
        Department, 
        Level) in (select Code,
                          Area,
                          Department,
                          min(Level)
                     from TABLE_NAME
                 group by Code,
                          Area,
                          Department)
于 2013-10-11T09:47:16.103 回答
0
select   
   s.*   
from table s,  
   (select   
      code, area, department, min(level) m  
    from 
      table  
    group by 
      code,area,department  
) min_v  
where 
   s.code = min_v.code  
   and s.area= min_v.area  
   and s.department = min_v.department  
   and s.level = min_v.m  
;
于 2013-10-11T09:55:15.330 回答
0

你可以尝试类似的东西

SELECT Code, Area, Department, Level, Name
FROM (
  SELECT Code, Area, Department, Level, Name, ROW_NUMBER() OVER (PARTITION BY Code, Area, Department, Name ORDER BY Level) __RN
  FROM TABLE_NAME) subQuery
WHERE __RN = 1

在不了解表架构的更多信息的情况下,很难说出从数据的分组版本连接到表的最佳方式是什么。使用 ROW_NUMBER() 可能效率更高,但您可以根据表中的实际唯一键来减少分区中的元素。

于 2013-10-11T09:35:36.087 回答