powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Трудности поиска даты последнего изменения наименования
13 сообщений из 13, страница 1 из 1
Трудности поиска даты последнего изменения наименования
    #39794639
alxvrn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день прошу помощи в написании запроса, есть таблица
Код: sql
1.
2.
3.
4.
5.
6.
  create table #t 
  (
     ID numeric (15,0)
    ,Name varchar(140)
    ,MDate datetime
  )



id - код наименования, name - наименование, Mdate - дата изменения наименования

Надо выбрать за период дату последнего изменения наименования.
При этом
1) первая запись наименования Mdate равна Null
2) при создании записи код и само наименование могут не меняться - а меняется только дата:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
insert into #t
(ID, Name, Mdate) VALUES
(648, 'aaa', '01.03.2019 0:00:00'), 
(608, 'bbb', '10.03.2019 0:00:00'), 
(557, 'ccc', NULL), 
(557, 'ccc1', '09.03.2019 0:00:00'), 
(557, 'ccc', '15.03.2019 0:00:00'), 
(557, 'ccc', '20.03.2019 0:00:00'), 
(557, 'ccc1', '25.03.2019 0:00:00')



1)допустим при выборе периода с '2019-01-01' по '2019-03-20' последнее изменение по коду 377557 - 9.03.2019
2)допустим при выборе периода с '2019-03-09' по '2019-03-20' последнее изменение по коду 377557 - 15.03.2019

Спасибо
...
Рейтинг: 0 / 0
Трудности поиска даты последнего изменения наименования
    #39794643
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если данные, скажем, такие:

ID Name Mdate557 'ccc1' '09.03.2019 0:00:00'557 'ccc2' '10.03.2019 0:00:00' 557 'ccc3' '11.03.2019 0:00:00' 557 'ccc2' '12.03.2019 0:00:00' 557 'ccc1' '13.03.2019 0:00:00'

то каким будет ответ за весь этот период?
...
Рейтинг: 0 / 0
Трудности поиска даты последнего изменения наименования
    #39794646
alxvrn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
13.03.2019, так как прошлое значение наименования отличается от наименования с максимальной датой.
...
Рейтинг: 0 / 0
Трудности поиска даты последнего изменения наименования
    #39794657
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иными словами, в заданном периоде нужна дата последнего изменения по сравнению с предыдущим по дате значением? ну тогда, наверное, что-то типа

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
WITH cte AS (SELECT ID, Name, Mdate, LAG(Name) OVER (PARTITION BY ID ORDER BY Mdate ASC) lagName
             FROM table
             WHERE Mdate <= @end)
SELECT ID, MAX(MDate)
FROM cte 
WHERE Name != lagName
  AND Mdate >= @start
GROUP BY ID
...
Рейтинг: 0 / 0
Трудности поиска даты последнего изменения наименования
    #39794685
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alxvrn,

Код: 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.
35.
36.
SET LANGUAGE Russian;

  create table #t 
  (
     ID numeric (15,0)
    ,Name varchar(140)
    ,MDate datetime
  )

insert into #t
(ID, Name, Mdate) VALUES
(648, 'aaa', '01.03.2019 0:00:00'), 
(608, 'bbb', '10.03.2019 0:00:00'), 
(557, 'ccc', NULL), 
(557, 'ccc1', '09.03.2019 0:00:00'), 
(557, 'ccc', '15.03.2019 0:00:00'), 
(557, 'ccc', '20.03.2019 0:00:00'), 
(557, 'ccc1', '25.03.2019 0:00:00')
;

SELECT * FROM 
(
	SELECT TOP 1 WITH TIES * FROM 
	(
		SELECT * FROM 
		(
			SELECT ID, Name, Mdate, LEAD(Name, 1) OVER (PARTITION BY ID ORDER BY Mdate ASC) AS Name_Lead  FROM #t
		) a
		WHERE Name_Lead IS NULL OR Name <> Name_Lead OR (Name IS NULL AND Name_Lead IS NOT NULL) 
	) b
	ORDER BY ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Mdate DESC)
) c 
ORDER BY ID, Mdate DESC;
GO 

DROP TABLE #t 
...
Рейтинг: 0 / 0
Трудности поиска даты последнего изменения наименования
    #39794699
ondorsal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alxvrn,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
with CTE AS 
(select 648 as ID, 'aaa' as Name, '01.03.2019 0:00:00' as Mdate
union all
select 608 as ID, 'bbb' as Name,'10.03.2019 0:00:00' as Mdate 
union all
select 557 as ID, 'ccc' as Name, NULL as Mdate
union all
select 557 as ID, 'ccc1' as Name, '09.03.2019 0:00:00' as Mdate
union all
select 557 as ID , 'ccc' as Name, '15.03.2019 0:00:00' as Mdate
union all
select 557 as ID, 'ccc' as Name, '20.03.2019 0:00:00' as Mdate 
union all
select 557 as ID, 'ccc1' as Name, '25.03.2019 0:00:00' as Mdate)

select Id,Name,Mdate from(
select  row_number () over(partition by ID,Name order by Mdate desc) as Num, ID,Name,Mdate from CTE
where CTE.Mdate between'01.03.2019 0:00:00'and'25.03.2019 0:00:00'/*Период*/) as T
where T.Num=1
...
Рейтинг: 0 / 0
Трудности поиска даты последнего изменения наименования
    #39794760
alxvrn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
каюсь, БД, на Sybase

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
Трудности поиска даты последнего изменения наименования
    #39794995
Фотография sasha27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alxvrn,
Код: sql
1.
2.
3.
select Name, max(Mdate) from #t
where Mdate between '2019.03.20' and '2019.03.01' or (Mdate is not null)
group by name;



если нужно по конкретному имени - подставьте его в условие
...
Рейтинг: 0 / 0
Трудности поиска даты последнего изменения наименования
    #39795348
alxvrn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sasha27, группировка в рамках ID нужна и как я писал в начале, когда у одного ИД имеются подряд 2 записи с одинаковым наименованием надо выбрать меньшую дату из этих записей.
...
Рейтинг: 0 / 0
Трудности поиска даты последнего изменения наименования
    #39795387
Фотография sasha27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alxvrnsasha27, группировка в рамках ID нужна и как я писал в начале, когда у одного ИД имеются подряд 2 записи с одинаковым наименованием надо выбрать меньшую дату из этих записей.

group by необходима при использовании агрегатных функций в select , в данном случае max(Mdate)
...
Рейтинг: 0 / 0
Трудности поиска даты последнего изменения наименования
    #39795438
alxvrn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sasha27,
а в случае одинаковых имен у разных Ид будет неверный результат
...
Рейтинг: 0 / 0
Трудности поиска даты последнего изменения наименования
    #39795562
Фотография sasha27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alxvrn,

Добавьте ID в select

Код: sql
1.
2.
3.
select id, Name, max(Mdate) from #t
where Mdate between '2019.03.20' and '2019.03.01' or (Mdate is not null)
group by Id, name;


и измените условие под ваши нужды
...
Рейтинг: 0 / 0
Трудности поиска даты последнего изменения наименования
    #39795595
antand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alxvrnsasha27,
а в случае одинаковых имен у разных Ид будет неверный результат
Насколько я понял задачу, группировать можно только по ID. Наименование в Вашей таблице - это новое наименование у какой-то сущности, которая в другой таблице. А это история изменения наименований.

Если Вам наименование текущее не нужно, то простая группировка по ID
Если Вам Вам нужно текущее наименование в результирующем запросе, то надо или добавлять Join c той другой таблицей или подзапросом после группировки.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Трудности поиска даты последнего изменения наименования
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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