2014-11-04 2 views
1

У меня огромная таблица со 100 полями. Каждая строка имеет временную метку. Я хочу найти последнее значение, отличное от нуля, для всех столбцов. Я использую MySql 5.6 InnoDBmysql: найти самые новые ненулевые значения

например.

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 столбцов.

Я искал решение для прошлой пары наших и ничего не нашел. Любая помощь была бы весьма признательна.

Благодаря

+0

В чем именно ваш вопрос? вы ищете «сложный» способ сделать это, чтобы избежать создания запроса с 100 условиями? –

+0

есть. Я уверен, что есть лучший способ сделать этот поиск в SQL. –

+0

Ваш алгоритм неясен. Как достичь этого ожидаемого результата? Кажется, вы группируете pub_name. – Sebas

ответ

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, а не пустую строку, как образец, который вы предоставили.

+0

спасибо. Это похоже на то, что он идеально подходит для скрипки. Я собираюсь попробовать это на своем наборе данных и вернуться и принять это как ответ. Я попытался использовать условие if только для проверки нулевой и пустой строки, но, похоже, не работает. Это, по всей вероятности, означает, что я делаю что-то неправильно, но это скорее любопытство. Еще раз спасибо –

+0

Должен был использовать условие случая. [Вот скрипка] (http://sqlfiddle.com/#!2/924834/1), которая работает с нулями и пустой строкой –

Смежные вопросы