sql选择较小的组

时间:2016-07-05 20:42:08

标签: mysql sql sql-server

我有下表有3列。我需要通过“apprul_num_sequence”列从最低到最高排序,并留在“apprul_cd_fare_rule_bigint”小调。如第二个表所示,这将是预期的结果。我觉得这是一个分组依据和排序的查询,但我无法猜测。有什么想法吗?

+--------------------------+-------------------+------------------+
|apprul_cd_fare_rule_bigint|apprul_num_sequence|apprul_crr_segment|
+--------------------------+-------------------+------------------+
|                      INNJ|            4999800|                 1|
|                      INNJ|            4999800|                 2|
|                      INNJ|            4999800|                 3|
|                      INNJ|            4999800|                 4|
|                      INNJ|            4999800|                 5|
|                      INNJ|            4999800|                 6|
|                      INNR|            5000000|                 1|
|                      INNR|            5000000|                 2|
|                      LW15|            5004900|                 1|
|                      INNJ|            5005000|                 1|
|                      INNJ|            5005000|                 2|
|                      INNJ|            5005000|                 3|
|                      INNJ|            5005000|                 4|
|                      INNJ|            5005000|                 5|
|                      INNJ|            5005000|                 6|
+--------------------------+-------------------+------------------+ 

预期结果:

+--------------------------+-------------------+------------------+
|apprul_cd_fare_rule_bigint|apprul_num_sequence|apprul_crr_segment|
+--------------------------+-------------------+------------------+
|                      INNJ|            4999800|                 1|
|                      INNJ|            4999800|                 2|
|                      INNJ|            4999800|                 3|
|                      INNJ|            4999800|                 4|
|                      INNJ|            4999800|                 5|
|                      INNJ|            4999800|                 6|
|                      INNR|            5000000|                 1|
|                      INNR|            5000000|                 2|
|                      LW15|            5004900|                 1|   
+--------------------------+-------------------+------------------+  

也就是说,我必须使用“apprul_cd_fare_rule_bigint”并使用最低的“apprul_num_sequence”,如果不止一个就像INNJ那样。

2 个答案:

答案 0 :(得分:0)

您可以在子句中使用带子查询

select * from my_table
where (apprul_cd_fare_rule_bigint, apprul_num_sequence)
in (select apprul_cd_fare_rule_bigint,  min(apprul_num_sequence) 
        from my_table group by apprul_cd_fare_rule_bigint )
order by apprul_num_sequence

答案 1 :(得分:0)

在SQL Server中,您可以使用窗口函数执行此操作:

select t.*
from (select t.*,
             dense_rank() over (partition by apprul_cd_fare_rule_bigint
                                order by apprul_num_sequence
                               ) as seqnum
      from t
     ) t
where seqnum = 1;

在任一数据库中,您都可以在where子句中使用相关子查询:

select t.*
from t
where t.apprul_num_sequence = (select min(t2.apprul_num_sequence)
                               from t t2
                               where t2.apprul_cd_fare_rule_bigint = t.apprul_cd_fare_rule_bigint
                              );