Гость
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Трудности поиска даты последнего изменения наименования / 13 сообщений из 13, страница 1 из 1
01.04.2019, 15:03
    #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
01.04.2019, 15:09
    #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
01.04.2019, 15:24
    #39794646
alxvrn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Трудности поиска даты последнего изменения наименования
13.03.2019, так как прошлое значение наименования отличается от наименования с максимальной датой.
...
Рейтинг: 0 / 0
01.04.2019, 15:46
    #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
01.04.2019, 16:20
    #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
01.04.2019, 16:36
    #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
01.04.2019, 18:12
    #39794760
alxvrn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Трудности поиска даты последнего изменения наименования
каюсь, БД, на Sybase

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
02.04.2019, 10:26
    #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
02.04.2019, 17:20
    #39795348
alxvrn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Трудности поиска даты последнего изменения наименования
sasha27, группировка в рамках ID нужна и как я писал в начале, когда у одного ИД имеются подряд 2 записи с одинаковым наименованием надо выбрать меньшую дату из этих записей.
...
Рейтинг: 0 / 0
02.04.2019, 18:44
    #39795387
sasha27
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Трудности поиска даты последнего изменения наименования
alxvrnsasha27, группировка в рамках ID нужна и как я писал в начале, когда у одного ИД имеются подряд 2 записи с одинаковым наименованием надо выбрать меньшую дату из этих записей.

group by необходима при использовании агрегатных функций в select , в данном случае max(Mdate)
...
Рейтинг: 0 / 0
02.04.2019, 21:55
    #39795438
alxvrn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Трудности поиска даты последнего изменения наименования
sasha27,
а в случае одинаковых имен у разных Ид будет неверный результат
...
Рейтинг: 0 / 0
03.04.2019, 09:21
    #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
03.04.2019, 09:56
    #39795595
antand
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Трудности поиска даты последнего изменения наименования
alxvrnsasha27,
а в случае одинаковых имен у разных Ид будет неверный результат
Насколько я понял задачу, группировать можно только по ID. Наименование в Вашей таблице - это новое наименование у какой-то сущности, которая в другой таблице. А это история изменения наименований.

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


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