mysql:找到最新的非null值

时间:2014-11-04 20:54:58

标签: mysql

我有一张包含100个字段的大桌子。每行都有时间戳。我想找到所有列的最新非null值。我正在使用MySql 5.6 InnoDB

e.g。

create table tester(
pub_id int,
pub_name varchar(20),
pub_city varchar(20),
country varchar(20),
no_of_branch varchar(20),
estd datetime
);


insert into tester (pub_id, pub_name, pub_city, country, estd)
values 
(1,  'a', 'xyz', 'abcity' , 'a', '1970-01-01 00:00:01'),
(2,  'a', 'xyz', ''       , 'a', '1971-01-01 00:00:01'),
(3,  'a', 'xyz', 'abcity1', 'b', '1972-01-01 00:00:01'),
(4,  'a', 'xyz', ''       , 'a', '1973-01-01 00:00:01'),
(5,  'a', 'xyz', 'abcity2', '' , '1974-01-01 00:00:01'),
(6,  'b', 'lmn', 'abcity' , 'a', '1974-01-01 00:00:01'),
(7,  'b', 'xyz', ''       , 'a', '1975-01-01 00:00:01'),
(8,  'b', 'sdf', 'abcity1', 'b', '1976-01-01 00:00:01'),
(9,  'b', ''   , ''       , 'a', '1977-01-01 00:00:01'),
(10, 'b', ''   , 'abcity2', '' , '1978-01-01 00:00:01');

我想查询那会给我:

'a', 'xyz', 'abcity2', 'a'
'b', 'sdf', 'abcity2', 'b'

我不想使用查询,其中我单独为表的每一列找到空值,然后进行连接,因为这将是一个非常麻烦的任务,因为我的实际表有100列。

我已经为我们几个人的过去寻找解决方案而一无所获。非常感谢你的帮助。

由于

1 个答案:

答案 0 :(得分:1)

这可能是"棘手"你正在寻找的方式。

首先创建一个双表(tester2)以接收聚合数据。此新表必须具有pub_name上的主键以及要聚合的所有列。然后做一个INSERT INTO ON DUPLICATE KEY UPDATE。此查询基本上将重建tester表,但不会重复和使用聚合数据。实际上是这样的:

insert into tester2 (pub_name, pub_city, country, no_of_branch)
  select pub_name, pub_city, country, no_of_branch FROM tester order by estd desc
on duplicate key 
update
   pub_city = coalesce(tester2.pub_city,tester.pub_city), 
   country = coalesce(tester2.country,tester.country), 
   no_of_branch = coalesce(tester2.no_of_branch,tester.no_of_branch)

tester2的内容将是:

PUB_NAME   PUB_CITY   COUNTRY   NO_OF_BRANCH
a          xyz        abcity2   a
b          sdf        abcity2   a

查看SQL Fiddle

注意:我认为你的意思是真正的NULL值,而不是像你提供的样本那样的空字符串。