SQL - 通过复杂条件获取特定行

时间:2015-02-24 15:12:09

标签: sql sql-server

我有下表:

+-----------+-----------+-------+
| ItemCode1 | ItemCode2 | Value |
+-----------+-----------+-------+
| X1        | Y1        |     1 |
| X2        | Y1        |    50 |
| X3        | Y3        |     1 |
| X4        | Y4        |    20 |
| X5        | Y4        |     1 |
+-----------+-----------+-------+

我想根据最高值为每个不同的ItemCode2选择1个ItemCode1。 I.E,输出表应如下所示:

+-----------+-----------+-------+
| ItemCode1 | ItemCode2 | Value |
+-----------+-----------+-------+
| X2        | Y1        | 50    |
| X3        | Y3        | 1     |
| X4        | Y4        | 20    |
+-----------+-----------+-------+

我知道它应该很容易,但出于某种原因,我不能得到这个...... 帮助真的很感激!

4 个答案:

答案 0 :(得分:4)

select t1.itemcode1, t1.itemcode2, t1.value
from your_table t1
join
(
  select max(value) mvalue, itemcode2
  from your_table
  group by itemcode2
) t2 on t1.value = t2.mvalue 
    and t1.itemcode2 = t2.itemcode2

答案 1 :(得分:4)

您可以使用ROW_NUMBER()获取具有最高值的记录,然后在外部查询中仅选择此一条记录:

SELECT ItemCode1, ItemCode2, Value
FROM (
   SELECT ItemCode1, ItemCode, Value, 
          ROW_NUMBER() OVER (PARTITION BY ItemCode2 ORDER BY Value DESC) rn
   FROM MyTable ) t
WHERE t.rn = 1

如果有多个记录具有相同的最大值,并且您希望返回所有这些记录,则必须将ROW_NUMBER()替换为RANK()

答案 2 :(得分:1)

选择ItemCode2的值= max(value)的所有行。

select ItemCode1, ItemCode2, Value 
from tablename t1
where Value = (select max(Value)
               from tablename t2
               where t1.ItemCode2 = t2.ItemCode2)

请注意,如果多行具有相同的最大值,则会返回所有行。

答案 3 :(得分:0)

这是我提交的内容。根据执行计划的比较,这应该比执行子查询更快地执行一半。散列连接已删除。

with
List( ItemCode1, ItemCode2, Value )as(
    select 'X1', 'Y1',  20 union all
    select 'X2', 'Y1',  50 union all
    select 'X3', 'Y3',   1 union all
    select 'X4', 'Y4',  20 union all
    select 'X5', 'Y4',  20 union all
    select 'X6', 'Y4',  50 union all
    select 'X7', 'Y4',  75
),
Partial( ItemCode1, ItemCode2, Value, rnk )as(
    select l.ItemCode1, l.ItemCode2, l.Value,
           ROW_NUMBER() over( partition by l.ItemCode2 order by l.Value desc ) rnk
    from list l
)
select  ItemCode1, ItemCode2, Value
from    Partial
where   rnk = 1;

如您所见,我添加了一些额外的数据行。不能有太多的测试数据!