Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Получить минимальную дату / 4 сообщений из 4, страница 1 из 1
27.03.2019, 15:56
    #39792434
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить минимальную дату
Здравствуйте!

Нужно выгрузить таблицу с полями "Город", "Код ТТ", "SKU" и "Дата". Где "Дата" – это первая (min) дата отгрузки для пары "Код ТТ - SKU".

Написал такой MDX-запрос.

MDX-запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
WITH
MEMBER [Measures].[Min Дата] AS
	 MIN
		(EXISTING 
			//NONEMPTY(
				{[Торговые точки].[Код ТТ].CURRENTMEMBER}*
					{[SKU].[Общее SKU].CURRENTMEMBER}*
					{[Время].[Дата].[Дата].MEMBERS}
			//	,[Measures].[Отгрузки шт]
			//)
		,IIF
			(
				[Measures].[Отгрузки шт] = 0
				,NULL
				,[Время].[Дата].CurrentMember.MEMBERVALUE
			)
		)
SELECT
NON EMPTY
	{[Measures].[Отгрузки шт],
	[Measures].[Min Дата]} ON 0,
NON EMPTY
	[Города].[Город].[Город]*
	[Торговые точки].[Код ТТ].[Код ТТ]*
	[SKU].[Общее SKU].[Общее SKU]*
	[Время].[Дата].[Дата]
//HAVING
//	[Время].[Дата].CurrentMember.MEMBERVALUE = [Measures].[Min Дата]
//...
ON 1
FROM
	(SELECT (
	[Время].[Дата].&[2019-01-01T00:00:00]:[Время].[Дата].&[2019-03-26T00:00:00]
	,{[Торговые точки].[Код ТТ].&[00001грд],[Торговые точки].[Код ТТ].&[00002грд]}) ON 0 FROM PROFIT)


Выдает такой результат:

Город Код ТТ Общее SKU Дата Отгрузки шт Min ДатаГород1 00001грд SKU1 26.02.2019 2 26.02.2019Город1 00001грд SKU1 05.03.2019 2 05.03.2019Город1 00001грд SKU2 08.01.2019 2 08.01.2019Город1 00001грд SKU2 12.02.2019 2 12.02.2019Город1 00001грд SKU2 26.02.2019 2 26.02.2019Город1 00001грд SKU2 05.03.2019 2 05.03.2019Город1 00001грд SKU2 12.03.2019 2 12.03.2019Город1 00001грд SKU2 19.03.2019 4 19.03.2019Город1 00001грд SKU2 26.03.2019 2 26.03.2019
Результат не верный.


В промежуточном результате должно быть так:

Город Код ТТ Общее SKU Дата Отгрузки шт Min ДатаГород1 00001грд SKU1 26.02.2019 2 26.02.2019Город1 00001грд SKU1 05.03.2019 2 26.02.2019Город1 00001грд SKU2 08.01.2019 2 08.01.2019Город1 00001грд SKU2 12.02.2019 2 08.01.2019Город1 00001грд SKU2 26.02.2019 2 08.01.2019Город1 00001грд SKU2 05.03.2019 2 08.01.2019Город1 00001грд SKU2 12.03.2019 2 08.01.2019Город1 00001грд SKU2 19.03.2019 4 08.01.2019Город1 00001грд SKU2 26.03.2019 2 08.01.2019

А в конечном результате - так:

Город Код ТТ Общее SKU Дата Отгрузки шт Min ДатаГород1 00001грд SKU1 26.02.2019 2 26.02.2019Город1 00001грд SKU2 08.01.2019 2 08.01.2019

Время выгрузки - 6 минут 15 секунд. Учитывая, что выгружались 2 ТТ точки с 1 января 2019. А выгрузка будет по всем ТТ с 1 января 2018. Если использовать функцию NONEMPTY, которая закоментирована в запросе, то дольше выгружает.

1. Как правильно написать запрос, чтобы выгружалось как в конечной таблице?

2. Как написать запрос более оптимально, чтобы быстрее выгружалось?
...
Рейтинг: 0 / 0
27.03.2019, 17:41
    #39792497
grAlex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить минимальную дату
ferzmikk,
Попробуй так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
WITH
MEMBER [Measures].[Min Дата] AS HEAD(NONEMPTY(EXISTING [Время].[Дата].[Дата].MEMBERS, ([Measures].[Отгрузки шт])),1).Item(0).MEMBER_CAPTION

SELECT
NON EMPTY
	{[Measures].[Отгрузки шт],
	[Measures].[Min Дата]} ON 0,
NON EMPTY
	[Города].[Город].[Город]*
	[Торговые точки].[Код ТТ].[Код ТТ]*
	nonempty([SKU].[Общее SKU].[Общее SKU].Members,([Measures].[Отгрузки шт]))
	ON 1
FROM PROFIT
WHERE 
({[Время].[Дата].&[2019-01-01T00:00:00]:[Время].[Дата].&[2019-03-26T00:00:00]},{[Торговые точки].[Код ТТ].&[00001грд],[Торговые точки].[Код ТТ].&[00002грд]})
...
Рейтинг: 0 / 0
27.03.2019, 23:16
    #39792646
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить минимальную дату
grAlex,

Запрос работает.

Заметил. Если
Код: sql
1.
{[Время].[Дата].&[2019-01-01T00:00:00]:[Время].[Дата].&[2019-03-26T00:00:00]} 

поместить в субкуб, то берутся даты и ранние заданного периода. Если в WHERE, то берутся нужные даты.

1. Возникает вопрос. В условии написано что "Нужно выгрузить таблицу с полями "Город", "Код ТТ", "SKU" и "Дата". Где "Дата" – это первая (min) дата отгрузки для пары "Код ТТ - SKU" ." Не совсем понимаю, как это уже учитывается в MDX-запросе?

Код: sql
1.
2.
3.
4.
5.
NON EMPTY
	[Города].[Город].[Город]*
	[Торговые точки].[Код ТТ].[Код ТТ]*
	NONEMPTY([SKU].[Общее SKU].[Общее SKU].Members,([Measures].[Отгрузки шт]))
ON 1


Получается атрибут [Города].[Город].[Город] участвует в группировке? Бывают ТТ, которые меняют город как центр финансового ответственного. И этот атрибут сохраняет историчность. То есть отображает не текущие города для предыдущих периодов, которые были до замены.

И почему в функция NONEMPTY используется только атрибут [SKU].[Общее SKU].[Общее SKU] ?

2. Время запроса - 10 секунд для двух ТТ. Если выгружать все ТТ и с 01.01.2016 года, долго выгружает. Как можно еще оптимизировать, чтобы быстрее выгружался?
...
Рейтинг: 0 / 0
28.03.2019, 14:10
    #39792940
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить минимальную дату
ferzmikkПолучается атрибут [Города].[Город].[Город] участвует в группировке? Бывают ТТ, которые меняют город как центр финансового ответственного. И этот атрибут сохраняет историчность. То есть отображает не текущие города для предыдущих периодов, которые были до замены.Хотя есть еще такой атрибут [Города].[Город Текущий].[Город Текущий]
...
Рейтинг: 0 / 0
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Получить минимальную дату / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]