powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / сопоставить даты действия договора
5 сообщений из 5, страница 1 из 1
сопоставить даты действия договора
    #39617062
minya13_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
SET NOCOUNT ON
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO


IF OBJECT_ID('[TestDoc].[A]') IS NOT NULL
  DROP TABLE [TestDoc].[A]


IF SCHEMA_ID('TestDoc') IS NULL
  EXEC('
    CREATE SCHEMA [TestDoc]
  ')
GO

IF OBJECT_ID('[TestDoc].[A]') IS NULL
  
CREATE TABLE [TestDoc].[A]
  (
    [Id]        Int           NOT NULL  IDENTITY(1,1),
    [contractID] int    not null,
    [DataFirst]     Date   NULL,
    [DateEnd]  Date       NULL,  
    [value]    float          NOT NULL,
   PRIMARY KEY CLUSTERED([Id])
  )
GO

INSERT INTO [TestDoc].[A]

SELECT 1,null,'2018-03-10',500
UNION
SELECT 1,null,'2018-03-16',600
UNION
SELECT 1,null, '2018-03-19',900
UNION
SELECT 1,'2018-03-09',null,200
UNION
SELECT 1,'2018-03-17',null,300
UNION
SELECT 1,'2018-03-23',null,400
UNION
SELECT 2, '2018-02-01',null,200
UNION
SELECT 2, '2018-02-05',null,350
UNION
SELECT 2,null,'2018-02-07',250



Нужно получить таблицу вида:


contractIDDateFirstDateEndvalue12018-03-092018-03-1020012018-03-102018-03-1650012018-03-162018-03-1760012018-03-172018-03-1930012018-03-192018-03-2390012018-03-23null40022018-02-012018-02-0520022018-02-052018-02-0735022018-02-07null250

Версия SQL2008 R2
...
Рейтинг: 0 / 0
сопоставить даты действия договора
    #39617066
minya13_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и такого вида, т.е. либо действие смотреть по начальной дате, второй запрос по конечной дате


contractIDdateFirstdateEndvalue12018-03-092018-03-1050012018-03-102018-03-1660012018-03-162018-03-1730012018-03-172018-03-1990012018-03-192018-03-2340022018-02-012018-02-0535022018-02-052018-02-07250
...
Рейтинг: 0 / 0
сопоставить даты действия договора
    #39617123
xenix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
получилось как-то громоздко, но вечером тяжело думается
Код: 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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
WITH CTE(CONTRACT_ID,DateStart,DateEnd,Value) AS
(
  SELECT 1 ,null,'2018-03-10',500
UNION
SELECT 1,null,'2018-03-16',600
UNION
SELECT 1,null, '2018-03-19',900
UNION
SELECT 1,'2018-03-09',null,200
UNION
SELECT 1,'2018-03-17',null,300
UNION
SELECT 1,'2018-03-23',null,400
UNION
SELECT 2, '2018-02-01',null,200
UNION
SELECT 2, '2018-02-05',null,350
UNION
SELECT 2,null,'2018-02-07',250
),
C2 AS
(
  SELECT C.CONTRACT_ID,
  ISNULL(C.DATESTART,C.DateEnd)DATESTART,
  ISNULL(C.DATEEND,C.DateStart)DATEEND,
  C.VALUE
  FROM CTE C
),
C3 AS
(
SELECT X.CONTRACT_ID,X.DATESTART,X.DATEEND,X.VALUE,
ROW_NUMBER()OVER(PARTITION BY X.CONTRACT_ID ORDER BY X.DATESTART ASC)XCOL
FROM C2 X  
),
OPENED AS
(
  SELECT C.CONTRACT_ID,C.DateStart,C.VALUE,
  ROW_NUMBER()OVER(PARTITION BY C.CONTRACT_ID ORDER BY C.DATESTART DESC,C.DATEEND ASC)XCOL
  FROM C3 C
  
  
),
CLOSEDINTERVALS AS
(
SELECT C.CONTRACT_ID,X.DATESTART,C.DATEEND,X.Value
FROM C3 C
JOIN C3 X ON C.CONTRACT_ID=X.CONTRACT_ID AND C.XCOL=X.XCOL+1

),
PREV AS
(
SELECT CL.CONTRACT_ID,CL.DATESTART,CL.DATEEND,CL.VALUE
FROM CLOSEDINTERVALS CL

UNION ALL

SELECT OP.CONTRACT_ID,OP.DateStart,NULL DATEEND,OP.Value
FROM OPENED OP
WHERE OP.XCOL=1
)
SELECT P.CONTRACT_ID,P.DATESTART,P.DATEEND,P.VALUE
FROM PREV P
ORDER BY P.CONTRACT_ID ASC,P.DATESTART ASC
...
Рейтинг: 0 / 0
сопоставить даты действия договора
    #39617657
minya13_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не много не понял задачу. т.е. нужно получить таблицу вида. DateEnd - Это когда договор прекратил свое действие.
Ну если есть два значения, то приоритет отдаем первой дате т.е. DateFirst.
Мы должны брать значения согласно таблице, если договор на тот момент не действовал, то значение соответственно =0.
Например у нас есть строка, которая действовала до 10-03-2018 и равно она 200, и до 16-03-2018 и равна она 600, то в строке от 10 по 16, будет 600, т.к. 200 было до 10 числа , или строка есть как с 9 числа значение = 200, так и до 10.03. значение равно 500, берем значение равное 200


contractIDDateFirstDateEndvalue12018-03-092018-03-1020012018-03-102018-03-1660012018-03-162018-03-1790012018-03-172018-03-1930012018-03-192018-03-23 012018-03-23null40022018-02-012018-02-0520022018-02-052018-02-0735022018-02-07null0
...
Рейтинг: 0 / 0
сопоставить даты действия договора
    #39617666
minya13_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я думал обычное смещение, но не тут то было
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT a.contractID,a.d as DateFirst,a.r as DateEnd,a.value
FROM
(
select contractID
,coalesce(dataFirst,dateEnd) as d
,LEAD(coalesce(dataFirst,dateEnd)) OVER(PARTITION BY contractID ORDER BY coalesce(dataFirst,dateEnd)) as r
,value 
from TestDoc.A 
) as a

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


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