从表中选择2个最新的“组/批”记录

时间:2014-09-13 12:50:12

标签: mysql sql select

我有这个mysql表中的数据:

id  customer_id  int_proc   inventory
1   A           1           1   
2   A           4           1
3   A           5           1
4   A           0           2
5   A           5           2
6   A           6           2
7   B           6           1       
8   B           7           1
9   B           9           1
10  B           9           2
11  B           9           2
12  C           22          1

我想获取每个库存的最新2个int_proc值的所有数据,以及customer_id为A和B的位置。 我的结果应该是这样的:

id  customer_id  int_proc   inventory
2   A           4           1
3   A           5           1
5   A           5           2
6   A           6           2
8   B           7           1
9   B           9           1
10  B           9           2
11  B           9           2

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您可以使用Mysql的用户定义变量,并在同一客户组中为每个客户和每个广告资源的行提供排名,如果您想获得,则查询下方将为每个广告资源和同一客户群组提供2个最新int_proc最新的n条记录只是将where子句更改为where t2.r <= n

select 
t2.id,
t2.customer_id,
t2.int_proc, 
t2.inventory
from (
select t.*,
@r:= case when @g = t.customer_id
     then
          case when @sg = t.inventory 
          then  @r+1 
          else 1 end 
      else 1 end r,
@g:= t.customer_id g,
@sg:= t.inventory sg
from test t
cross join (select @g:=null,@sg:=null,@r:=null) t1
  where t.customer_id in('A','B')
order by t.customer_id,t.inventory,t.int_proc desc
  ) t2
where t2.r <= 2
order by id

Fiddle Demo

编辑重复值

如果您有int_proc的重复行,则必须添加另一个子案例语句以检查重复值并相应地对它们进行排名

select 
t2.id,
t2.customer_id,
t2.inventory,
t2.int_proc
from (
select t.*,
@r:= case when @g = t.customer_id
     then
          case when @sg = t.inventory 
          then 
            case when @sr <> t.int_proc
            then  @r+1 
            else @r end 
          else 1 end 
      else 1 end r,
@g:= t.customer_id g,
@sg:= t.inventory sg,
@sr:= t.int_proc sr
from test t
cross join (select @g:=null,@sg:=null,@r:=null,@sr:=null) t1
  where t.customer_id in('A','B')
order by t.customer_id,t.inventory,t.int_proc desc
  ) t2
 where t2.r <= 2
order by id

Fiddle Demo 2

答案 1 :(得分:-1)

@MKhalidJunaid:你的解决方案已经工作了很长时间。但是,我们现在获得多个结果集,而不是仅有两个最新的int_proc&#39; s。能否请您在http://www.sqlfiddle.com/#!2/e81fdf/2执行下表 (这可能是由于无序的数据行?)

CREATE TABLE test
    (`id` int, `customer_id` varchar(1), `int_proc` int, `inventory` int)
;

INSERT INTO test
    (`id`, `customer_id`, `int_proc`, `inventory`)
VALUES
    (1, 'A', 1, 1),
    (2, 'A', 4, 1),
    (3, 'A', 5, 1),
    (4, 'A', 0, 1),
    (5, 'A', 5, 1),
    (6, 'A', 6, 1),
    (7, 'A', 6, 1),
    (8, 'A', 7, 1),
    (9, 'A', 9, 1),
    (10, 'B', 91, 2),
    (11, 'B', 92, 2),
    (12, 'B', 93, 2),
    (13, 'B', 95, 2),
    (14, 'B', 95, 2),
    (15, 'C', 22, 1)

;