我有这个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
非常感谢任何帮助。
答案 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)
;