Mysql SQL从按唯一值分组的行中选择数据

Mysql SQL从按唯一值分组的行中选择数据,mysql,sql,Mysql,Sql,我有一张像这样的桌子: from |to|quani A1 |A2|200 B1 |B2|200 C1 |C2|210 D1 |D2|210 E1 |E2|220 F1 |F2|220 G1 |G2|220 H1 |H2|200 J1 |J2|200 我需要一个查询或脚本来获得如下内容: from|to|quani A1 |B2|200 C1 |D2|210 E1 |G2|220 H1 |J2|200 如果我使用GR

我有一张像这样的桌子:

from |to|quani
A1   |A2|200  
B1   |B2|200  
C1   |C2|210  
D1   |D2|210  
E1   |E2|220  
F1   |F2|220  
G1   |G2|220
H1   |H2|200
J1   |J2|200
我需要一个查询或脚本来获得如下内容:

from|to|quani
A1  |B2|200  
C1  |D2|210  
E1  |G2|220
H1  |J2|200
如果我使用GROUP BY quani,它会选择

from|to|quani
A1  |A2|200  
C1  |C2|210  
E1  |E2|220  
尝试以下查询:

    select min(temp.from_) as from_,
       max(temp.to_) as to_,
       temp.quani as quani
       from
(SELECT t.*,
      (case when @prev = quani 
      then @rowid 
      else @rowid:=@rowid+1 
      end
      ) as rowid,
@prev:= quani as prev
FROM t, (SELECT @rowid:=0,@prev:=1) as init
ORDER BY from_) as temp
group by temp.quani,temp.rowid;
尝试以下查询:

    select min(temp.from_) as from_,
       max(temp.to_) as to_,
       temp.quani as quani
       from
(SELECT t.*,
      (case when @prev = quani 
      then @rowid 
      else @rowid:=@rowid+1 
      end
      ) as rowid,
@prev:= quani as prev
FROM t, (SELECT @rowid:=0,@prev:=1) as init
ORDER BY from_) as temp
group by temp.quani,temp.rowid;

似乎您需要按quani分组的值的最小值

select min(from), min(to), quani
from my_table 
group by quani

似乎您需要按quani分组的值的最小值

select min(from), min(to), quani
from my_table 
group by quani

假设您可以按第一列排序,那么您需要quani更改的行。一种方法使用变量。下面是使用相关子查询的另一种方法:

select t.*,
       (select t2.to
        from t t2
        where t2.to < t.to
        order by t2.to desc
        limit 1
       ) as prev_to
from t
having prev_to is null or prev_to <> to;
注:

在较大的表上,性能不会很好,但在索引上,quani可以提供帮助。 to和from是SQL关键字,因此它们是非常糟糕的列名称。 have-without-aggregation是一个MySQL扩展,它允许在不使用子查询的情况下按列别名进行过滤。 条件也可以写为where not prev_to to,但是空安全运算符不太熟悉。
假设您可以按第一列排序,那么您需要quani更改的行。一种方法使用变量。下面是使用相关子查询的另一种方法:

select t.*,
       (select t2.to
        from t t2
        where t2.to < t.to
        order by t2.to desc
        limit 1
       ) as prev_to
from t
having prev_to is null or prev_to <> to;
注:

在较大的表上,性能不会很好,但在索引上,quani可以提供帮助。 to和from是SQL关键字,因此它们是非常糟糕的列名称。 have-without-aggregation是一个MySQL扩展,它允许在不使用子查询的情况下按列别名进行过滤。 条件也可以写为where not prev_to to,但是空安全运算符不太熟悉。

按顺序描述,你试过了吗?在最后一次编辑后,问题可能重复的地方很清楚,除了预期结果中的打字错误。无法理解为什么它会被搁置!!请不要编辑你的问题,说答案给了你答案。相反,你发现这是最有用的。@DonaldDuck根据OP,他无法将其标记为答案,因为问题已由to DESC搁置。你试过了吗?上一次编辑后,问题的可能重复内容非常清楚,除了预期结果中的一个打字错误。无法理解为什么它会被搁置!!请不要编辑你的问题,说答案给了你答案。相反,你认为这是最有帮助的。@DonaldDuck根据OP,他无法将其标记为答案,因为问题被搁置。当我将他们分组时,我松开了H1 | G2 | 200行,然后尝试用wya清楚地解释获得你所追求的结果的规则。为什么是minto?很明显,OP希望最大值为到。当我对它们进行分组时,我松开了H1 | G2 | 200行,然后尝试用一个清晰的wya解释获得您所期望的结果的规则。为什么是minto?很明显,OP希望最大值为。请尝试编辑的查询并检查演示。它应该完全符合你的要求。这正是我所需要的。非常感谢。很乐意帮忙。如果你还能做,请把它标记为答案。谢谢。不幸的是它被搁置了,我只能编辑或删除这个问题。我认为它必须保留下来,因为你的解决方案可能会对其他人有所帮助。不知道为什么它被挂起。请尝试编辑的查询并检查演示。它应该完全符合你的要求。这正是我所需要的。非常感谢。很乐意帮忙。如果你还能做,请把它标记为答案。谢谢。不幸的是它被搁置了,我只能编辑或删除这个问题。我认为它必须保留下来,因为你的解决方案可能会对其他人有所帮助。不知道为什么它被搁置了。