powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как использовать значение строки с предыдущей датой
13 сообщений из 13, страница 1 из 1
Как использовать значение строки с предыдущей датой
    #39702284
Badhabit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Есть подобная таблица:
авторdate val1 va2
02.02.2018 100 200
02.02.2018 100 200
05.02.2018 150
05.02.2018 150
05.02.2018 150
06.02.2018 100
06.02.2018 100
06.02.2018 100
06.02.2018 100

Как для строко с датой 2018-05-02 использовать значение поля val1, указанное для строк с date = 2018-02-02 ну и соответсвенно для строк с датой 2018-05-06 использовать значение поля val1, уже расчитаное значение val1 для date = 2018-02-05?
...
Рейтинг: 0 / 0
Как использовать значение строки с предыдущей датой
    #39702352
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
загадочное условие, давайте подробнее.
нарисуйте какой результат должен быть.
...
Рейтинг: 0 / 0
Как использовать значение строки с предыдущей датой
    #39702353
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RTFM LEAD(),LAG()
...
Рейтинг: 0 / 0
Как использовать значение строки с предыдущей датой
    #39702396
demind10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, а вдруг у Badhabit MS SQL 2008 ?
...
Рейтинг: 0 / 0
Как использовать значение строки с предыдущей датой
    #39702399
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demind10Akina, а вдруг у Badhabit MS SQL 2008 ?тогда - TOP 1 в [cross | outer] apply-подзапросе.
А вдруг у ТС сервер ниже 2005, то скалярный коррелированный ТОР-1-подзапрос в списке select.
А вдруг у ТС не MS SQL Server? Ведь и такое бывает.
...
Рейтинг: 0 / 0
Как использовать значение строки с предыдущей датой
    #39702502
demind10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна, да это я так, придираюсь. Настроение просто отвратительное и иногда мне бы лучше помолчать, может за умного сойду. А так ваш ответ и ответ Akina, вероятно, полностью покрывает все возможные варианты.
...
Рейтинг: 0 / 0
Как использовать значение строки с предыдущей датой
    #39702625
Badhabit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, вот поподробнее. (серевер 2016)
Есть такая таблица. Значения полей plus и minus повторяются (одинаковые) для строк с одной датой.
Надо расчтать новое поле in_calc для каждой строки по формуле in_calc (предыдущего дня) - minus (предыдущего дня) + plus (предыдущего дня) и результат проставить каждого текущего дня
для первого дня поле не in_calc расчитывается т.к. нет in_calc (предыдущего дня) и новое поле будет равно просто in первого дня.
Исходная таблица:
авторzzz in minus plus data
1111111 100 10 5 02.02.2018
1111111 100 10 5 02.02.2018
1111111 100 10 5 02.02.2018
1111111 100 10 5 02.02.2018
1111111 100 10 5 02.02.2018
1111111 100 10 5 02.02.2018
1111111 100 10 5 02.02.2018
1111111 100 10 5 02.02.2018
1111111 100 10 5 02.02.2018
1111111 100 30 50 05.02.2018
1111111 100 30 50 05.02.2018
1111111 100 200 250 06.02.2018
1111111 100 200 250 06.02.2018
1111111 100 200 250 06.02.2018
1111111 100 1 5 07.02.2018
1111111 100 1 5 07.02.2018

Должна получться:
авторzzz in minus plus data in_calc
1111111 100 10 5 02.02.2018 100
1111111 100 10 5 02.02.2018 100
1111111 100 10 5 02.02.2018 100
1111111 100 10 5 02.02.2018 100
1111111 100 10 5 02.02.2018 100
1111111 100 10 5 02.02.2018 100
1111111 100 10 5 02.02.2018 100
1111111 100 10 5 02.02.2018 100
1111111 100 10 5 02.02.2018 100
1111111 100 30 50 05.02.2018 95
1111111 100 30 50 05.02.2018 95
1111111 100 200 250 06.02.2018 115
1111111 100 200 250 06.02.2018 115
1111111 100 200 250 06.02.2018 115
1111111 100 1 5 07.02.2018 165
1111111 100 1 5 07.02.2018 165

Я сделал как-то так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
use test
select	
	zzz
	, [in]
	, minus
	, plus
	, data
	, iif(
		lag(DATA) OVER(order by DATA) <> DATA,
		iif(
			lag([in]) OVER(order by DATA) is null,
			[in],
			(lag([in]) OVER(order by DATA)) - (lag([minus]) OVER(order by DATA)) + (lag([plus]) OVER(order by DATA))
		),
		lag([in]) OVER(order by DATA)
	) 'in_calc'
from tbl


но соответвенно не получается расставить in_calc для каждой строки текущего дня и следовательно все расчеты сбиваются...
...
Рейтинг: 0 / 0
Как использовать значение строки с предыдущей датой
    #39702643
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Badhabit,

каждая таблица в SQL должна иметь уникальный ключ.
Где он в вашей таблице?
Как можно обратиться к конкретной строке, если все значения совпадают в миллионе записей?
Что задаёт порядок строк в вашей таблице? Ничего? Как тогда можно рассуждать о "предыдущей дате"?
...
Рейтинг: 0 / 0
Как использовать значение строки с предыдущей датой
    #39702645
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapкаждая таблица в SQL должна иметь уникальный ключ.

Зачем же так категорично.
...
Рейтинг: 0 / 0
Как использовать значение строки с предыдущей датой
    #39702646
Badhabit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap, нет у меня уникального ключа. Теоритически можно пронумеровать строки, но не особо понимаю как это может
...
Рейтинг: 0 / 0
Как использовать значение строки с предыдущей датой
    #39702648
Badhabit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
порядок задается только датами, внутри для порядка нет
...
Рейтинг: 0 / 0
Как использовать значение строки с предыдущей датой
    #39702764
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
with cteData (zzz, inv, minus, plus, date)
as (
              select 1111111, 100, 10  ,5,   cast('02.02.2018' as date)
    union all select 1111111, 100, 10  ,5,   cast('02.02.2018' as date)
    union all select 1111111, 100, 10  ,5,   cast('02.02.2018' as date)
    union all select 1111111, 100, 10  ,5,   cast('02.02.2018' as date)
    union all select 1111111, 100, 10  ,5,   cast('02.02.2018' as date)
    union all select 1111111, 100, 10  ,5,   cast('02.02.2018' as date)
    union all select 1111111, 100, 10  ,5,   cast('02.02.2018' as date)
    union all select 1111111, 100, 10  ,5,   cast('02.02.2018' as date)
    union all select 1111111, 100, 10  ,5,   cast('02.02.2018' as date)
    union all select 1111111, 100, 30  ,50,  cast('05.02.2018' as date)
    union all select 1111111, 100, 30  ,50,  cast('05.02.2018' as date)
    union all select 1111111, 100, 200 ,250, cast('06.02.2018' as date)
    union all select 1111111, 100, 200 ,250, cast('06.02.2018' as date)
    union all select 1111111, 100, 200 ,250, cast('06.02.2018' as date)
    union all select 1111111, 100, 1   ,5,   cast('07.02.2018' as date)
    union all select 1111111, 100, 1   ,5,   cast('07.02.2018' as date)
) ,
cteCalcs
as (
    select d.zzz
         , d.inv
         , d.minus
         , d.plus
         , d.date
         , lead(d.date) over(order by d.date) as NextDate
         , d.inv + sum(d.plus - d.minus) over(order by d.date) as calc
    from (select distinct * from cteData) d
)
select d.*, isnull(c.calc, d.inv) as calc
from cteData d 
    left join cteCalcs c on c.NextDate = d.date and c.zzz = d.zzz
...
Рейтинг: 0 / 0
Как использовать значение строки с предыдущей датой
    #39702769
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вообще зачем вам дубликаты в таблице?
смысл иметь одинаковые значения для одной даты?
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как использовать значение строки с предыдущей датой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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