powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / история перемещения документа
4 сообщений из 4, страница 1 из 1
история перемещения документа
    #39884215
bamper78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добрый день.

Прошу помощи в составлении запроса по истории перемещения документа

есть выборка документа нахождения на определенном складе в определенный момент времени
Код: 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.
CREATE TABLE #sklad
(
	[ID] [uniqueidentifier] NOT NULL,
	ChangeDate NVARCHAR(100),
	NameSklad NVARCHAR(100)

)
 
INSERT INTO #sklad (ID,ChangeDate,NameSklad) VALUES 
('D4311972-3115-4D51-9D18-07D1C60E2D4C','2019-07-31 13:26:40.490','Склад 1'), 
('D4311972-3115-4D51-9D18-07D1C60E2D4C','2019-07-31 13:27:39.467','Склад 1'), 
('D4311972-3115-4D51-9D18-07D1C60E2D4C','2019-07-31 13:28:07.720','Склад 1'), 
('D4311972-3115-4D51-9D18-07D1C60E2D4C','2019-07-31 13:28:33.247','Склад 1'),
('D4311972-3115-4D51-9D18-07D1C60E2D4C','2019-07-31 13:37:05.857','Склад 1'),
('D4311972-3115-4D51-9D18-07D1C60E2D4C','2019-08-09 16:43:32.917','Склад 2'),
('D4311972-3115-4D51-9D18-07D1C60E2D4C','2019-08-14 10:03:45.410','Склад 2'),
('D4311972-3115-4D51-9D18-07D1C60E2D4C','2019-08-21 16:56:59.107','Склад 2'),
('D4311972-3115-4D51-9D18-07D1C60E2D4C','2019-08-22 13:40:19.577','Склад 3'),
('D4311972-3115-4D51-9D18-07D1C60E2D4C','2019-08-22 13:54:58.457','Склад 3'),
('D4311972-3115-4D51-9D18-07D1C60E2D4C','2019-08-22 14:05:39.293','Склад 2'),
('D4311972-3115-4D51-9D18-07D1C60E2D4C','2019-08-22 14:05:50.903','Склад 2'),
('D4311972-3115-4D51-9D18-07D1C60E2D4C','2019-08-22 14:09:00.213','Склад 2'),
('D4311972-3115-4D51-9D18-07D1C60E2D4C','2019-08-22 14:26:07.417','Склад 2'),
('D4311972-3115-4D51-9D18-07D1C60E2D4C','2019-08-23 11:07:32.107','Склад 3')

SELECT * FROM #sklad

DROP TABLE #sklad



Требуется получить выборку с движением документа по складам
Делаю так

Код: 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.
SELECT *
,ROW_NUMBER() over (partition by ID order by ChangeDate) as [ROW_NUMBER] 
INTO #temp_sklad
FROM #sklad

SELECT * FROM #temp_sklad

SELECT *

FROM
(
	SELECT 
	ds_next.*
	,prev.[NameSklad] as PrevOwner
	,prev2.[NameSklad] as PrevPrevOwner
	,row_number() over (partition by ds_next.ID, ds_next.[NameSklad] order by ds_next.[ChangeDate] asc) rnum
	FROM  #temp_sklad ds_next
	left JOIN #temp_sklad prev ON prev.ID = ds_next.ID AND ds_next.ROW_NUMBER - 1 = prev.ROW_NUMBER AND prev.[NameSklad] != ds_next.[NameSklad]
	left JOIN #temp_sklad prev2 ON prev2.ID = prev.ID AND prev.ROW_NUMBER - 2 = prev2.ROW_NUMBER AND prev2.[NameSklad] != prev.[NameSklad]
	
)s
WHERE  s.rnum = 1 

DROP TABLE #sklad
DROP TABLE #temp_sklad 



но пропадает первый склад 1 в из истории, когда документ находиться на склад 3
Код: sql
1.
2.
3.
4.
ID	ChangeDate	NameSklad	ROW_NUMBER	PrevOwner	PrevPrevOwner	rnum
D4311972-3115-4D51-9D18-07D1C60E2D4C	2019-07-31 13:26:40.490	Склад 1	1	NULL	NULL	1
D4311972-3115-4D51-9D18-07D1C60E2D4C	2019-08-09 16:43:32.917	Склад 2	6	Склад 1	NULL	1
D4311972-3115-4D51-9D18-07D1C60E2D4C	2019-08-22 13:40:19.577	Склад 3	9	Склад 2	NULL	1



т.е последняя строка должна иметь вид
Код: sql
1.
D4311972-3115-4D51-9D18-07D1C60E2D4C	2019-08-22 13:40:19.577	Склад 3	9	Склад 2	Склад 1	1



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

Код: 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.
;with cte as (
	select
		[ID]
		,ChangeDate
		,NameSklad
		,row_number()over(partition by [ID] order by ChangeDate) - row_number()over(partition by [ID], NameSklad order by ChangeDate) as inv
	from #sklad	 
),
cte1 as (
	select
		[ID]
		,min(ChangeDate) as ChangeDate
		,NameSklad
		,rn		=row_number()over(partition by [ID] order by min(ChangeDate))	 
	from cte
	group by
		[ID]
		,NameSklad
		,inv
)
select 
	 t1.*
	 ,t2.NameSklad as PrevOwner	
	 ,t3.NameSklad as PrevPrevOwner	

from cte1 t1
left join cte1 t2 on t1.ID = t2.ID and t1.rn = t2.rn + 1
left join cte1 t3 on t1.ID = t3.ID and t1.rn = t3.rn + 2
order by 2



IDChangeDateNameSkladrnPrevOwnerPrevPrevOwnerD4311972-3115-4D51-9D18-07D1C60E2D4C2019-07-31 13:26:40.490Склад 11NULLNULLD4311972-3115-4D51-9D18-07D1C60E2D4C2019-08-09 16:43:32.917Склад 22Склад 1NULLD4311972-3115-4D51-9D18-07D1C60E2D4C2019-08-22 13:40:19.577Склад 33Склад 2Склад 1D4311972-3115-4D51-9D18-07D1C60E2D4C2019-08-22 14:05:39.293Склад 24Склад 3Склад 2D4311972-3115-4D51-9D18-07D1C60E2D4C2019-08-23 11:07:32.107Склад 35Склад 2Склад 3
...
Рейтинг: 0 / 0
история перемещения документа
    #39884491
Remind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
;WITH CTE AS
(
  SELECT 
    ID,
    NameSklad,
    ChangeDate, 
    ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ChangeDate) - ROW_NUMBER() OVER (PARTITION BY ID, NameSklad ORDER BY ChangeDate) AS GRP
  FROM #sklad
)
SELECT
  ID,
  NameSklad,
  MIN(ChangeDate) AS ChangeDate, 
  LAG(NameSklad)    OVER (PARTITION BY ID ORDER BY MIN(ChangeDate)) AS PrevSklad,
  LAG(NameSklad, 2) OVER (PARTITION BY ID ORDER BY MIN(ChangeDate)) AS PrevPrevSklad
FROM cte
GROUP BY ID, NameSklad, GRP
...
Рейтинг: 0 / 0
история перемещения документа
    #39885007
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bamper78,

создайте таблицу движения документов и операцию перемещения документа. У вас изначально кривая архитектура, вы так сверку толком никогда не сделаете. Данные надо сравнивать по явным признакам, а не косвенным.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / история перемещения документа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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