Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как использовать значение строки с предыдущей датой / 13 сообщений из 13, страница 1 из 1
13.09.2018, 17:44
    #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
13.09.2018, 22:18
    #39702352
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать значение строки с предыдущей датой
загадочное условие, давайте подробнее.
нарисуйте какой результат должен быть.
...
Рейтинг: 0 / 0
13.09.2018, 22:28
    #39702353
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать значение строки с предыдущей датой
RTFM LEAD(),LAG()
...
Рейтинг: 0 / 0
14.09.2018, 08:22
    #39702396
demind10
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать значение строки с предыдущей датой
Akina, а вдруг у Badhabit MS SQL 2008 ?
...
Рейтинг: 0 / 0
14.09.2018, 08:29
    #39702399
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать значение строки с предыдущей датой
demind10Akina, а вдруг у Badhabit MS SQL 2008 ?тогда - TOP 1 в [cross | outer] apply-подзапросе.
А вдруг у ТС сервер ниже 2005, то скалярный коррелированный ТОР-1-подзапрос в списке select.
А вдруг у ТС не MS SQL Server? Ведь и такое бывает.
...
Рейтинг: 0 / 0
14.09.2018, 11:16
    #39702502
demind10
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать значение строки с предыдущей датой
Щукина Анна, да это я так, придираюсь. Настроение просто отвратительное и иногда мне бы лучше помолчать, может за умного сойду. А так ваш ответ и ответ Akina, вероятно, полностью покрывает все возможные варианты.
...
Рейтинг: 0 / 0
14.09.2018, 13:28
    #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
14.09.2018, 13:46
    #39702643
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать значение строки с предыдущей датой
Badhabit,

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

Зачем же так категорично.
...
Рейтинг: 0 / 0
14.09.2018, 13:49
    #39702646
Badhabit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать значение строки с предыдущей датой
iap, нет у меня уникального ключа. Теоритически можно пронумеровать строки, но не особо понимаю как это может
...
Рейтинг: 0 / 0
14.09.2018, 13:49
    #39702648
Badhabit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать значение строки с предыдущей датой
порядок задается только датами, внутри для порядка нет
...
Рейтинг: 0 / 0
14.09.2018, 16:22
    #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
14.09.2018, 16:32
    #39702769
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать значение строки с предыдущей датой
а вообще зачем вам дубликаты в таблице?
смысл иметь одинаковые значения для одной даты?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как использовать значение строки с предыдущей датой / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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