:: Visual Foxpro, Foxpro for DOS
Слить две записи в одну несколькими способами
tata
Автор

Сообщений: 3458
Откуда: Казань
Дата регистрации: 23.10.2005
Есть select.
Есть картинка с результатом его работы.
Две верхних записи (для примера) абсолютно одинаковые, отличаются только датами в разных полях.
Их нужно слить в одну запись.
Я для этого использовала Max(Data) и группировку.
Шеф утверждает, что существуют как минимум 2 варианта слияния без Max и без группировки.
Что-то ничего в голову не приходит.
Подскажите!
Не дает вставлять картинки > 50.
Objectid                                    ||       Date1            ||   Date2            ||  Date3           ||  Date4
================================================================================================================================
002be6d2-97e7-4d2c-8caa-cdcbf3347fc7        ||       2022-11-15       ||   2022-11-30       ||   NULL           ||  NULL
002be6d2-97e7-4d2c-8caa-cdcbf3347fc7        ||       NULL             ||   NULL            ||  2022-12-01       ||  2022-12-30



Исправлено 10 раз(а). Последнее : Joys, 28.06.22 11:11
Ratings: 0 negative/0 positive
Re: Слить две записи в одну несколькими способами
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
А так?

select
s.classifierfederalcode,
o.name,
o.rgisid,
o.id as objectid,
s.id as actionid,
m.necessityid,
case
when p.baseprocedureid = '0f1677ea-3ad9-4316-8fd5-6f597747a3f2'
then lin.planstartdate::date
end as planstartreg,
case
When p.baseprocedureid = '0f1677ea-3ad9-4316-8fd5-6f597747a3f2'
then lin.deadline::date
end as planendreg,
Case
When p.baseprocedureid = '0f1677ea-3ad9-4316-8fd5-6f597747a3f2'
Then (select LL.planstartdate::date from roadmap.linkobjecttoprocedure LL where LL.procedureid = '0f1677ea-3ad9-4316-8fd5-6f597747a3f2' limit 1)
end as transtart,
Case
When p.baseprocedureid = '0f1677ea-3ad9-4316-8fd5-6f597747a3f2'
Then (select LL.deadline::date from roadmap.linkobjecttoprocedure LL where LL.procedureid = '0f1677ea-3ad9-4316-8fd5-6f597747a3f2' limit 1)
end as transend
FROM get_last_approved_gp(:p_year) r
JOIN mmobjectsubprogramaction m ON r.versionid=m.versionid AND m.isdelete =FALSE
JOIN roadmap.linkobjecttoprocedure lin ON lin.subprogramactionid =m.subprogramactionid AND m.objectid =lin.objectid
JOIN get_last_dk(:p_year) d ON d.versionid =lin.roadmapversionid
inner join subprogramaction s on m.subprogramactionid = s.id
inner join object o on m.objectid = o.id
inner join roadmap.procedure p on lin.procedureid = p.id
and (p.baseprocedureid = '0f1677ea-3ad9-4316-8fd5-6f597747a3f2')
-- or p.baseprocedureid = 'fd0b8f4f-0a19-49e8-8a52-34cbb840d38e')
where 1 = 1
and lin.isdelete = false
--and o.id='76956920-867a-4dc6-b799-d094958e24ad'
-- group by o.id,
-- s.id,
-- m.necessityid
order by 1, 2,3, 4 desc


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 2 раз(а). Последнее : PaulWist, 27.06.22 21:57
Ratings: 0 negative/0 positive
Re: Слить две записи в одну несколькими способами
tata
Автор

Сообщений: 3458
Откуда: Казань
Дата регистрации: 23.10.2005
Только так пока.
CREATE OR REPLACE FUNCTION roadmap.upload_real(p_year integer)
RETURNS TABLE(classifierfederalcode character varying, rgisid character varying, necessityid character varying,
planstartreg date, planendreg date, transtart date, transend date)

LANGUAGE plpgsql

AS $function$

begin
RETURN query
select
s.classifierfederalcode,
-- o.name,
o.rgisid,
-- o.id as objectid,
-- s.id as actionid,
m.necessityid,
-- lin.procedireid,
MAX(case
when p.baseprocedureid = '0f1677ea-3ad9-4316-8fd5-6f597747a3f2'
then lin.planstartdate::date
end) as planstartreg,
max(case
When p.baseprocedureid = '0f1677ea-3ad9-4316-8fd5-6f597747a3f2'
then lin.deadline::date
end) as planendreg,
max(Case
When p.baseprocedureid = 'fd0b8f4f-0a19-49e8-8a52-34cbb840d38e'
Then lin.planstartdate::date
end) as transtart,
max(Case
When p.baseprocedureid = 'fd0b8f4f-0a19-49e8-8a52-34cbb840d38e'
Then lin.deadline::date
end) as transend
FROM get_last_approved_gp(p_year) r
JOIN mmobjectsubprogramaction m ON r.versionid=m.versionid AND m.isdelete =FALSE
JOIN roadmap.linkobjecttoprocedure lin ON lin.subprogramactionid =m.subprogramactionid AND m.objectid =lin.objectid
JOIN get_last_dk(p_year) d ON d.versionid =lin.roadmapversionid
inner join subprogramaction s on m.subprogramactionid = s.id
inner join object o on m.objectid = o.id
inner join roadmap.procedure p on lin.procedureid = p.id
and (p.baseprocedureid = '0f1677ea-3ad9-4316-8fd5-6f597747a3f2'
or p.baseprocedureid = 'fd0b8f4f-0a19-49e8-8a52-34cbb840d38e')
where 1 = 1
and lin.isdelete = false
group by o.id,
s.id,
m.necessityid
order by 1, 2,3, 4 desc;


END;
$function$
;


;
Ratings: 0 negative/0 positive
Re: Слить две записи в одну несколькими способами
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Нуу, max просто спрятан в ф-ию. Не выход


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Слить две записи в одну несколькими способами
Владимир Максимов

Сообщений: 14095
Откуда: Москва
Дата регистрации: 02.09.2000
Если в рамках FoxPro или SQL, то, в общем случае, шеф бессовестно врёт

Чтобы исключить группировку необходимо делать отдельные выборки по уникальным значениям. Причем первая выборка по первой записи, вторая - по второй. Потом через Left Join объединять. Это существенно сложнее, чем группировка

Но судя по синтаксису, это вообще не FoxPro. Возможно, в этом языке есть какие-то свои "фичи"

Нет, ну можно пронумеровать (ROW_NUMBER) выборки, потом отбирать по номерам. Но, повторюсь, это существенно сложнее обычной группировки

Т.е. идея вот такая

select
tab1.ObjectId
NVL(tab1.Date1, tab2.Date1) as Date1,
NVL(tab1.Date2, tab2.Date2) as Date2,
NVL(tab1.Date3, tab2.Date3) as Date3,
NVL(tab1.Date4, tab2.Date4) as Date4
from Tab as tab1
left join Tab as tab2 on tab1.ObjectId = tab2.ObjectId
and tab2.Номер_строки = 2
where tab1.Номер_строки = 1

Вопрос только в том, как "вычислить" значение "Номер_строки", чтобы "развести" строки по разным выборкам. Возможно, в таблицах это есть, просто не показано в примере. Тогда шеф прав. Но, в общем случае, это сделать сложнее.
Ratings: 0 negative/0 positive
Re: Слить две записи в одну несколькими способами
tata
Автор

Сообщений: 3458
Откуда: Казань
Дата регистрации: 23.10.2005
Так это та, что работает уже.
А еще 2 надо.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 9 NSF  (Гостей: 8)

© 2000-2024 Fox Club 
Яндекс.Метрика