Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сравнение и вывод  [new]
GUEST00001324
Guest
Добрый день!
Подскажите пожалуйста, есть таблица (5 столбцов)
Необходимо сделать выборку когда в определенном столбце цифра стала больше чем была.

Спасибо.
2 авг 17, 12:19    [20694532]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение и вывод  [new]
Добрый Э - Эх
Guest
GUEST00001324,

стала и была - это две разные строки в таблице или два разных состояния одной и той же строки?

З.Ы.
А лучше - приведи тестовый набор данных и желаемый результат на этом наборе
2 авг 17, 12:29    [20694573]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение и вывод  [new]
GUEST00001324
Guest
Пример:
Имеются столбцы: id, карта, дата, время, сумма.

Сумма постоянно меняется.
1200.23
1134.01
2700.04

Необходимо это зафиксировать повышение суммы и вывести изменение, когда это произошло и карту.
2 авг 17, 12:45    [20694639]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение и вывод  [new]
Добрый Э - Эх
Guest
GUEST00001324,

0) lead/lag
1) apply + top 1
2 авг 17, 12:56    [20694679]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение и вывод  [new]
GUEST00001324
Guest
Уточняю записей больше 1000
Нужно вывести период т.е. когда произошло пополнение например: карта1/дата1/время1/110.01
карта1/дата2/время2/23987.07

Прошу прощения за сложности :)
2 авг 17, 13:01    [20694693]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение и вывод  [new]
что бы это значило
Guest
GUEST00001324,
ничего не понятно, нужен пример: есть данные -> нужно получить. Наглядно
2 авг 17, 13:14    [20694736]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение и вывод  [new]
Добрый Э - Эх
Guest
GUEST00001324,

Ф.А.К., пункт №6
2 авг 17, 13:14    [20694737]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение и вывод  [new]
982183
Member

Откуда: VL
Сообщений: 3350
GUEST00001324
Сумма постоянно меняется.
1200.23
1134.01
2700.04

Это означает, что "в разных строках поле сумма разная" или "внешнее приложение постоянно меняет значения в поле сумма"
2 авг 17, 13:29    [20694812]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение и вывод  [new]
982183
Member

Откуда: VL
Сообщений: 3350
GUEST00001324
Уточняю записей больше 1000
Нужно вывести период т.е. когда произошло пополнение например: карта1/дата1/время1/110.01
карта1/дата2/время2/23987.07


Т.Е.
Получить таблицу
Карта/дата1/время1/дата2/время2/сумма1/сумма2/(сумма2-сумма1=пополнение)
При условии, что сумма2>сумма1

Так?
2 авг 17, 13:33    [20694833]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение и вывод  [new]
GUEST00001324
Guest
SELECT TOP 1000 [id]
,[cardid]
,[date]
,[time]
,[amount]
FROM [test].[dbo].[cards]


id - int
cardid - varchar
date - int
Time - int
amount - float

Пример:
Имеются столбцы: id, карта, дата, время, сумма.

Сумма постоянно меняется. (в разных строках поле сумма разная)
1200.23
1134.01
2700.04

Нужно вывести период т.е. когда произошло пополнение например: карта1/дата1/время1/110.01
карта1/дата2/время2/23987.07


Прошу прощения!
2 авг 17, 13:34    [20694837]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение и вывод  [new]
GUEST00001324
Guest
982183,
Да, все верно.
Учитывая что карты разные.
2 авг 17, 13:47    [20694877]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение и вывод  [new]
982183
Member

Откуда: VL
Сообщений: 3350
Как пробовал?
2 авг 17, 14:48    [20695078]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение и вывод  [new]
rnk
Member

Откуда:
Сообщений: 126
GUEST00001324,
idcardiddtamount
11112017-07-21 00:00:00.0001000
21112017-07-22 00:00:00.0003000
31112017-07-23 00:00:00.0002000
41112017-07-24 00:00:00.0005000
51112017-07-25 00:00:00.0004000

Запрос:
with t as (
	select id,cardid,dt,amount, lead(amount) over (partition by cardid order by dt desc) as amount_last from mytable
) select * from t where isnull(amount_last,0) < amount order by dt

Результат запроса:
idcardiddtamountamount_last
11112017-07-21 00:00:00.0001000NULL
21112017-07-22 00:00:00.00030001000
41112017-07-24 00:00:00.00050002000


Оно?
2 авг 17, 16:10    [20695407]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение и вывод  [new]
GUEST00001324
Guest
А можете подсказать как это провернуть через курсор.
Никак не получается выборку нормально сделать.
2 авг 17, 22:34    [20696397]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение и вывод  [new]
GUEST00001324
Guest
Не могу понять в чем ошибка здесь
+

DECLARE @id int
DECLARE @cardid nvarchar(12)
DECLARE @date int
DECLARE @time int
DECLARE @amount float

DECLARE @refill float
DECLARE @brefill float

DECLARE @refill_cur as CURSOR
set @refill_cur = cursor for
select id, cardid, date, time, amount
from mytable
order by id, cardid, date, time
open @refill_cur
FETCH NEXT FROM @refill_cur INTO @id, @cardid, @date, @time, @amount;
set @brefill = @amount;

--FETCH NEXT FROM @refill_cur INTO @id, @cardid, @date, @time, @brefill;
--if @refill < 0


WHILE @@FETCH_STATUS = 0
BEGIN

set @refill = @brefill - @amount;
FETCH NEXT FROM @refill_cur INTO @id, @cardid, @date, @time, @brefill;
begin
--if @refill < 0
PRINT 'CardID '+@CardID+'|Date '+ cast(@hour as char(10))+'|Time '+cast(@quater as char(10))+'|'+ cast(@brefill as char(10))+'|'+cast(@refill as char(10));
end


--if @refill < 0
--set @brefill = @amount;
--FETCH NEXT FROM @refill_cur INTO @id, @cardid, @date, @time, @brefill;
--WHILE @@FETCH_STATUS = 0
IF @@FETCH_STATUS <> 0
PRINT ' <<End>>'

END
3 авг 17, 09:39    [20696949]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение и вывод  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Оно ?
select 
  cardid
,datetime
,amount
from T1
where amount > (select top 1 amount t2.Amount from T1 T_old where T_old.cardid = T1.cardid and T1.datetime > T_old.datetime order by T_old.datetime desc)
3 авг 17, 10:49    [20697182]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение и вывод  [new]
GUEST00001324
Guest
LSV
Оно ?
select 
  cardid
,datetime
,amount
from T1
where amount > (select top 1 amount t2.Amount from T1 T_old where T_old.cardid = T1.cardid and T1.datetime > T_old.datetime order by T_old.datetime desc)


Я так понимаю тут опущена конструкция:
with t_old as


Верно? Т.к. t_old отсутствует.
3 авг 17, 11:00    [20697233]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение и вывод  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31326
GUEST00001324
Я так понимаю тут опущена конструкция:
with t_old as



Верно? Т.к. t_old отсутствует.
Нет, t_old - это алиас второго экземпляра таблицы T1
3 авг 17, 16:21    [20698526]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение и вывод  [new]
rnk
Member

Откуда:
Сообщений: 126
LSV
Оно ?
select 
  cardid
,datetime
,amount
from T1
where amount > (select top 1 amount t2.Amount from T1 T_old where T_old.cardid = T1.cardid and T1.datetime > T_old.datetime order by T_old.datetime desc)


LEAD быстрее.
4 авг 17, 10:54    [20699955]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение и вывод  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
rnk
LEAD быстрее.
Угу. Но только с версии 2012. :)
И на сколько быстрее - это еще вопрос.
4 авг 17, 11:55    [20700260]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение и вывод  [new]
Jaffar
Member

Откуда:
Сообщений: 633
declare @__TEMP table(Kart numeric(16), DT datetime, Summ money)

insert into @__TEMP(Kart, DT, Summ)
          select 1, '2010-01-01', 100
union all select 1, '2010-01-03', 100
union all select 1, '2010-01-08', 150
union all select 2, '2010-01-05', 150
union all select 2, '2010-01-07', 120
union all select 2, '2010-01-12', 110
union all select 3, '2010-01-01', 100
union all select 3, '2010-01-04', 170


select t.Kart, t.Dt1, t.DT2, t.Summ1, t.Summ2, t.Summ2 - t.Summ1 Delta
from (select  t.KART, 
		      t.DT DT1,  
		      t.Summ Summ1, 
		      Lead(t.DT)   over(partition by t.Kart order by t.DT asc) DT2,
		      Lead(t.Summ) over(partition by t.Kart order by t.DT asc) Summ2
		from @__TEMP t /**/ ) t
where
		t.Summ2 > t.Summ1
order by t.Kart, t.DT1
4 авг 17, 12:30    [20700407]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить