Неофициальный форум пользователей Qlik Sense & Qlikview

Для разработчиков => Вопросы по Qlik Sense & QlikView => Тема начата: PadijVD от 20 июля 2015, 12:24:16

Название: Загрузка данных в Qlikivew
Отправлено: PadijVD от 20 июля 2015, 12:24:16
Добрый день!
Подскажите как можно исключить из загрузки файл по дате?
Имеются файлы для анализа со следующими столбцами (Excel файлы)
Дата публикации, id, номер и тд.
Нужно при загрузки проверить Дату публикации и загрузить файл с последней датой.
https://yadi.sk/i/E5yopoOqhxrLx (https://yadi.sk/i/E5yopoOqhxrLx)
Название: Re: Загрузка данных
Отправлено: kvv от 20 июля 2015, 12:43:46
Добрый день.
Нужно применить вот такую выборку:
SELECT field_01, date FROM table a WHERE date=(SELECT max(date) FROM table b WHERE a.field_01 = b.field_01);
Название: Re: Загрузка данных
Отправлено: PadijVD от 20 июля 2015, 12:53:29
Спасибо за ответ!
Если можно помогите внедрить в мой код

export:
LOAD
    //Основные данные
    FileName() as [Файл контракта],
    [contract/id] as id,
    [contract/number] as [№ контракта],
    [contract/regNum] as [Номер реестровой записи контракта],
    [contract/priceInfo/price] as [Цена контракта],
    [contract/href] as [Ссылка на источник],
    Date(Left([contract/publishDate],10),'DD MMMM YYYY') as [Дата публикации]

FROM [D:\ftp\Obrabotca\UnZIP\contract_*.xml] (XmlSimple, Table is [export]);
Название: Re: Загрузка данных
Отправлено: kvv от 20 июля 2015, 05:28:57
Есть возможность выложить "кусок" (20 строк) xml-файла, чтобы написал требуемую загрузку?

Название: Re: Загрузка данных
Отправлено: PadijVD от 20 июля 2015, 07:23:15
Да конечно.
https://yadi.sk/d/SZdhkjEAhySo6 (https://yadi.sk/d/SZdhkjEAhySo6)
Название: Re: Загрузка данных
Отправлено: kvv от 21 июля 2015, 09:53:13
Добрый день.
Поскольку все названия xml-файлов разные, то это вообще упрощается:

export:
LOAD
    //Основные данные
    FileName() as [Файл контракта],
    [contract/id] as id,
    [contract/number] as [№ контракта],
    [contract/regNum] as [Номер реестровой записи контракта],
    [contract/priceInfo/price] as [Цена контракта],
    [contract/href] as [Ссылка на источник],
    Date(Left([contract/publishDate],10),'DD.MM.YYYY') as [Дата публикации]
FROM [\contract_*.xml] (XmlSimple, Table is [export]);

max_date:
LOAD max([Дата публикации]) as max_date
Resident export;

LET d1 = date(FieldValue('max_date', 1), 'DD.MM.YYYY');

export_max:
LOAD [Файл контракта] as ContractFile,
     id,
     [№ контракта],
     [Номер реестровой записи контракта],
     [Цена контракта],
     [Ссылка на источник],
     [Дата публикации]
Resident export
where [Дата публикации] = '$(d1)';

drop Table export;


Как-то так.
Название: Re: Загрузка данных
Отправлено: PadijVD от 21 июля 2015, 11:58:29
и еще вопрос насколько я понимаю к загрузке берется только один файл (с максимальной датой публикации). А мне необходимо сделать проверку по столбцу 'Номер реестровой записи контракта' и в случае когда находятся два и более одинаковых номера,  загрузить файл с последней датой публикации + загрузить все остальные файлы.
Название: Re: Загрузка данных
Отправлено: kvv от 21 июля 2015, 11:58:50
Исправил, предыдущий скрипт.
Название: Re: Загрузка данных
Отправлено: kvv от 21 июля 2015, 12:33:55
Цитата: PadijVD от 21 июля  2015, 11:58:29  
и еще вопрос насколько я понимаю к загрузке берется только один файл (с максимальной датой публикации). А мне необходимо сделать проверку по столбцу 'Номер реестровой записи контракта' и в случае когда находятся два и более одинаковых номера,  загрузить файл с последней датой публикации + загрузить все остальные файлы.

Пока не нахожу решения, как это сделать в QlikView.

Можно загрузить все данные в БД и в БД уже можно написать нужный запрос:
SELECT field_01, date FROM table a WHERE date=(SELECT max(date) FROM table b WHERE a.field_01 = b.field_01);
Название: Re: Загрузка данных
Отправлено: PadijVD от 21 июля 2015, 12:36:17
Спасибо, буду тогда сам пытаться решить данный момент.
Название: Re: Загрузка данных
Отправлено: admin от 21 июля 2015, 12:40:06
Держите в курсе решения, освобожусь - посмотрю.
Название: Re: Загрузка данных
Отправлено: PadijVD от 21 июля 2015, 12:42:01
Цитата: admin от 21 июля  2015, 12:40:06  
Держите в курсе решения, освобожусь - посмотрю.
Хорошо! за любую помощь буду благодарен!
Название: Re: Загрузка данных в Qlikivew
Отправлено: kvv от 22 июля 2015, 03:55:37
Казалось бы - простая задача. А, как ее НОРМАЛЬНО решить с помощью QlikView - пока не понятно.

PadijVD, попробуйте частичное решение:
export_101:
LOAD
    //Основные данные
    FileName() as [Файл контракта_01],
    [contract/id] as id_01,
    [contract/number] as [№ контракта_01],
    [contract/regNum] as [Номер реестровой записи контракта_01],
    [contract/priceInfo/price] as [Цена контракта_01],
    [contract/href] as [Ссылка на источник_01],
    Date(Left([contract/publishDate],10),'DD.MM.YYYY') as [Дата публикации_01]
FROM [Temp\xml\contract_*.xml] (XmlSimple, Table is [export]);
STORE * from export_101 into export_101.qvd (qvd);
DROP Table export_101;

export_102:
Load distinct [Номер реестровой записи контракта_01] as [Номер реестровой записи контракта_02]
From [Temp\export_01.qvd] (qvd);
STORE * from export_102 into export_102.qvd (qvd);
DROP Table export_102;

export:
LOAD [Номер реестровой записи контракта_02] as [Номер реестровой записи контракта]
From [Temp\export_102.qvd] (qvd);

left join (export)
LOAD date(max([Дата публикации_01]), 'DD.MM.YYYY'),
[№ контракта_01] as [№ контракта],
[Номер реестровой записи контракта_01] as [Номер реестровой записи контракта],
[Цена контракта_01] as [Цена контракта],
[Ссылка на источник_01] as [Ссылка на источник]
From [Temp\export_101.qvd] (qvd)
Group By
[№ контракта_01],
[Номер реестровой записи контракта_01],
[Цена контракта_01],
[Ссылка на источник_01];

Название: Re: Загрузка данных в Qlikivew
Отправлено: PadijVD от 22 июля 2015, 07:09:14
Цитата: kvv от 22 июля  2015, 03:55:37  
Казалось бы - простая задача. А, как ее НОРМАЛЬНО решить с помощью QlikView - пока не понятно.

PadijVD, попробуйте частичное решение:
export_101:
LOAD
    //Основные данные
    FileName() as [Файл контракта_01],
    [contract/id] as id_01,
    [contract/number] as [№ контракта_01],
    [contract/regNum] as [Номер реестровой записи контракта_01],
    [contract/priceInfo/price] as [Цена контракта_01],
    [contract/href] as [Ссылка на источник_01],
    Date(Left([contract/publishDate],10),'DD.MM.YYYY') as [Дата публикации_01]
FROM [Temp\xml\contract_*.xml] (XmlSimple, Table is [export]);
STORE * from export_101 into export_101.qvd (qvd);
DROP Table export_101;

export_102:
Load distinct [Номер реестровой записи контракта_01] as [Номер реестровой записи контракта_02]
From [Temp\export_01.qvd] (qvd);
STORE * from export_102 into export_102.qvd (qvd);
DROP Table export_102;

export:
LOAD [Номер реестровой записи контракта_02] as [Номер реестровой записи контракта]
From [Temp\export_102.qvd] (qvd);

left join (export)
LOAD date(max([Дата публикации_01]), 'DD.MM.YYYY'),
[№ контракта_01] as [№ контракта],
[Номер реестровой записи контракта_01] as [Номер реестровой записи контракта],
[Цена контракта_01] as [Цена контракта],
[Ссылка на источник_01] as [Ссылка на источник]
From [Temp\export_101.qvd] (qvd)
Group By
[№ контракта_01],
[Номер реестровой записи контракта_01],
[Цена контракта_01],
[Ссылка на источник_01];


Спасибо! Сегодня попробую загрузить данные с данным кодом.
Название: Re: Загрузка данных в Qlikivew
Отправлено: admin от 23 июля 2015, 02:28:12
Привет, если я правильно понял задачу то вот примерный код:

export:
LOAD
FileName() as [Файл контракта],
    [contract/id] as id,
    [contract/number] as [№ контракта],
    [contract/regNum] as [Номер реестровой записи контракта],
    [contract/priceInfo/price] as [Цена контракта],
    [contract/href] as [Ссылка на источник],
    Date(Left([contract/publishDate],10),'DD MMMM YYYY') as [Дата публикации]
FROM [Контракты\contract_*.xml] (XmlSimple, Table is [export]);
STORE * from export into export0.qvd (qvd);
DROP Table export;

tmp0:
Load *, Hash160([Номер реестровой записи контракта],[Дата публикации]) as IdRow from export0.qvd (qvd);
STORE * from tmp0 into export0.qvd (qvd);

tmp1:
load Hash160([Номер реестровой записи контракта],[МаксДата]) as IdRow;
LOAD max([Дата публикации]) as МаксДата,
[Номер реестровой записи контракта]
Resident tmp0
Group by [Номер реестровой записи контракта];
DROP Table tmp0;
Left join LOAD * from export0.qvd (qvd);
drop Field IdRow;


Но возникает вопрос, какую брать запись в том случае когда записи отличаются только по id? Как с
Номером реестровой записи контракта = 0151200007014000002 от 24/06/2015 .
Название: Re: Загрузка данных в Qlikivew
Отправлено: PadijVD от 23 июля 2015, 03:48:51

Цитата: admin от 23 июля  2015, 02:28:12  
Привет, если я правильно понял задачу то вот примерный код:

export:
LOAD
FileName() as [Файл контракта],
    [contract/id] as id,
    [contract/number] as [№ контракта],
    [contract/regNum] as [Номер реестровой записи контракта],
    [contract/priceInfo/price] as [Цена контракта],
    [contract/href] as [Ссылка на источник],
    Date(Left([contract/publishDate],10),'DD MMMM YYYY') as [Дата публикации]
FROM [Контракты\contract_*.xml] (XmlSimple, Table is [export]);
STORE * from export into export0.qvd (qvd);
DROP Table export;

tmp0:
Load *, Hash160([Номер реестровой записи контракта],[Дата публикации]) as IdRow from export0.qvd (qvd);
STORE * from tmp0 into export0.qvd (qvd);

tmp1:
load Hash160([Номер реестровой записи контракта],[МаксДата]) as IdRow;
LOAD max([Дата публикации]) as МаксДата,
[Номер реестровой записи контракта]
Resident tmp0
Group by [Номер реестровой записи контракта];
DROP Table tmp0;
Left join LOAD * from export0.qvd (qvd);
drop Field IdRow;


Но возникает вопрос, какую брать запись в том случае когда записи отличаются только по id? Как с
Номером реестровой записи контракта = 0151200007014000002 от 24/06/2015 .
Добрый день!
Номер id всегда уникален. А вот номер реестровой записи повторяется при внесение каких либо изменений в контракт. Соответственно нужно из нескольких записей с одинаковым реестровым номером взять данные с последней датой публикации.
Сейчас попробую данный код применить. Предыдущий код от KVV так и не смог приладить.
Название: Re: Загрузка данных в Qlikivew
Отправлено: admin от 23 июля 2015, 03:53:46
Обрати внимание на записи в снимке.
Все поля кроме ID и файла совпадают.
Название: Re: Загрузка данных в Qlikivew
Отправлено: PadijVD от 23 июля 2015, 04:03:58
Цитата: admin от 23 июля  2015, 03:53:46  
Обрати внимание на записи в снимке.
Все поля кроме ID и файла совпадают.
Спасибо Всем за помощь!!! Вроде все заработало как надо!

Название: Re: Загрузка данных в Qlikivew
Отправлено: PadijVD от 23 июля 2015, 04:05:36
По поводу совпадения данных:
Изменения были в другой части файла, если необходим полный код для выборки всех данных, могу скинуть.
Название: Re: Загрузка данных в Qlikivew
Отправлено: admin от 23 июля 2015, 06:24:30
Цитата: PadijVD от 23 июля  2015, 04:05:36  
По поводу совпадения данных:
Изменения были в другой части файла, если необходим полный код для выборки всех данных, могу скинуть.
Было бы интересно посмотреть.
Название: Re: Загрузка данных в Qlikivew
Отправлено: PadijVD от 23 июля 2015, 07:15:58
Цитата: admin от 23 июля  2015, 06:24:30  
Цитата: PadijVD от 23 июля  2015, 04:05:36  
По поводу совпадения данных:
Изменения были в другой части файла, если необходим полный код для выборки всех данных, могу скинуть.
Было бы интересно посмотреть.

export:
LOAD
//Основные данные
    FileName() as [Файл контракта],
    [contract/foundation/oosOrder/order/notificationNumber] as [№ тендера],
    [contract/products/product/sid] as sid,
    [contract/id] as id,
    [contract/number] as [№ контракта],
    [contract/regNum] as [Номер реестровой записи контракта],
    replace([contract/priceInfo/price],'.',',') as [Стоимость контракта],
    [contract/href] as [Ссылка на источник],
    Date(Left([contract/publishDate],10),'DD MMMM YYYY') as [Дата публикации],

    if([contract/finances/budgetFunds/budgetLevel]='11', 'Федеральный бюджет',
    if([contract/finances/budgetFunds/budgetLevel]='12', 'Бюджет субъекта РФ',
    if([contract/finances/budgetFunds/budgetLevel]='13', 'Местный бюджет',
    [contract/finances/budgetFunds/budgetLevel])))  as [Источник бюджета],
   
//Заказчик
    Capitalize([contract/customer/fullName]) as [З-Полное наименование],
    [contract/customer/registrationDate] as [З-Дата регистрации],
    [contract/customer/inn] as [З-ИНН],
    [contract/customer/kpp] as [З-КПП],
    [contract/customer/legalForm/singularName] as [Тип заказчика],
       
//Поставщик
    lower (if([contract/suppliers/supplier/legalEntityRF/legalForm/singularName]='' or IsNull([contract/suppliers/supplier/legalEntityRF/legalForm/singularName]),
    'ИП',[contract/suppliers/supplier/legalEntityRF/legalForm/singularName])) as [Тип поставщика],
   
    if([contract/suppliers/supplier/legalEntityRF/legalForm/singularName]='' or IsNull([contract/suppliers/supplier/legalEntityRF/legalForm/singularName]),'ИП '&
    Capitalize( [contract/suppliers/supplier/individualPersonRF/lastName]&' '&
    [contract/suppliers/supplier/individualPersonRF/firstName]&' '&
    [contract/suppliers/supplier/individualPersonRF/middleName]),
    Capitalize([contract/suppliers/supplier/legalEntityRF/fullName])) as [П-Полное наименование],
       
    if([contract/suppliers/supplier/legalEntityRF/legalForm/singularName]='' or IsNull([contract/suppliers/supplier/legalEntityRF/legalForm/singularName]),
    [contract/suppliers/supplier/individualPersonRF/INN],
    [contract/suppliers/supplier/legalEntityRF/INN]) as [П-ИНН],
       
    if([contract/suppliers/supplier/legalEntityRF/legalForm/singularName]='' or IsNull([contract/suppliers/supplier/legalEntityRF/legalForm/singularName]),
    [contract/suppliers/supplier/individualPersonRF/address],
    [contract/suppliers/supplier/legalEntityRF/address]) as [П-Адрес],
       
    if([contract/suppliers/supplier/legalEntityRF/contactEMail]='' or IsNull([contract/suppliers/supplier/legalEntityRF/contactEMail]),
    [contract/suppliers/supplier/individualPersonRF/contactEMail],
    [contract/suppliers/supplier/legalEntityRF/contactEMail]) as [П-EMail],
         
    if([contract/suppliers/supplier/legalEntityRF/contactPhone]='' or IsNull([contract/suppliers/supplier/legalEntityRF/contactPhone]),
    [contract/suppliers/supplier/individualPersonRF/contactPhone],
    [contract/suppliers/supplier/legalEntityRF/contactPhone]) as [П-Телефон],
 
    if([contract/suppliers/supplier/legalEntityRF/contactInfo/lastName]='' or IsNull([contract/suppliers/supplier/legalEntityRF/contactInfo/lastName]),
    [contract/suppliers/supplier/individualPersonRF/lastName]&' '&
    [contract/suppliers/supplier/individualPersonRF/firstName]&' '&
    [contract/suppliers/supplier/individualPersonRF/middleName],   
    [contract/suppliers/supplier/legalEntityRF/contactInfo/lastName]&' '&
    [contract/suppliers/supplier/legalEntityRF/contactInfo/firstName]&' '&
    [contract/suppliers/supplier/legalEntityRF/contactInfo/middleName]) as [П-ФИО],
     
    if([contract/suppliers/supplier/legalEntityRF/OKTMO/name]='' or IsNull([contract/suppliers/supplier/legalEntityRF/OKTMO/name]),
    [contract/suppliers/supplier/individualPersonRF/OKTMO/name],
    [contract/suppliers/supplier/legalEntityRF/OKTMO/name]) as [OKTMO]
   
FROM [D:\ftp\Obrabotca\UnZIP\contract_*.xml] (XmlSimple, Table is [export]);
STORE * from export into D:\Выгрузка\служебные файлы\Архив\export0.qvd (qvd);
DROP Table export;

tmp0:
Load *, Hash160([Номер реестровой записи контракта],[Дата публикации]) as IdRow from D:\Выгрузка\служебные файлы\Архив\export0.qvd (qvd);
STORE * from tmp0 into D:\Выгрузка\служебные файлы\Архив\export0.qvd (qvd);

tmp1:
load Hash160([Номер реестровой записи контракта],[МаксДата]) as IdRow;
LOAD max([Дата публикации]) as МаксДата,
[Номер реестровой записи контракта]
Resident tmp0
Group by [Номер реестровой записи контракта];
DROP Table tmp0;
Left join LOAD * from D:\Выгрузка\служебные файлы\Архив\export0.qvd (qvd);
drop Field IdRow;
Название: Re: Загрузка данных в Qlikivew
Отправлено: PadijVD от 23 июля 2015, 07:29:45
Остался только вопрос как теперь сделать инкрементальную загрузку из всего этого, чтобы не перезагружать каждый раз все данные.

раньше это делалось с помощью вот такого кода:
////загружаем старые данные
//concatenate
//load
//*
//From D:\Выгрузка\служебные файлы\Архив\1.qvd (qvd);
//
////сохраняем новые + старые в один файл
//STORE export0 INTO D:\Выгрузка\служебные файлы\Архив\1.qvd (qvd);
Название: Re: Загрузка данных в Qlikivew
Отправлено: admin от 23 июля 2015, 07:46:58
Круто  :)
С hash160 я конечно погорячился  :), смысл в том, чтобы просто составной ключ создать.
Можно и hash128() либо просто склейку строк &.
А с инкрементальной загрузкой в чем проблема?
По сути ничего не изменилось.
Первоначальный файл как был так и остался, добавляется таблица с последними датами и все.