MSSQL создает и условно увеличивает столбец
Я получаю некоторые данные (в таблицу # temp), которые имеют некоторый логический порядок.
Когда я извлекаю данные, я хотел бы добавить новую последовательность / счетчик, который увеличивается только при выполнении определенных условий в других полях.
В идеале что-то вроде этого:
DECLARE @counter int = 0;
SELECT Item, Date, Event,
@counter = @counter +
(CASE
WHEN Event = 'Something' THEN 1
ELSE 0
END) AS EVENT_SEQ
INTO #tempTable
FROM MyData
ORDER BY Item, Date
SQL выдает мне две ошибки:
A SELECT statement that assigns a value to a variable must not be combined with data-retrieval operations.
Или
A SELECT INTO statement cannot contain a SELECT statement that assigns values to a variable.
Желаемый результат
ITEM DATE EVENT EVENT_SEQ
blah 2015-01-01 nothing 1
blah 2015-01-02 nothing 1
blah 2015-01-03 nothing 1
blah 2015-01-04 something 2
blah 2015-01-05 nothing 2
blah 2015-01-06 nothing 2
blah 2015-01-07 something 3
blah 2015-01-08 nothing 3
blah 2015-01-09 nothing 3
blah 2015-01-10 nothing 3
blah 2015-01-11 nothing 3
blah 2015-01-12 something 4
blah 2015-01-13 something 5
blah 2015-01-14 nothing 5
blah 2015-01-15 nothing 5
blah 2015-01-16 nothing 5
blah 2015-01-17 nothing 5
blah 2015-01-18 nothing 5
blah 2015-01-19 nothing 5
blah 2015-01-20 something 6
blah 2015-01-21 something 7
blah 2015-01-22 nothing 7
Аналогичный вопрос:
SQL Server 2012: условное увеличение счетчика пользователя ROW_NUMBER()
Я использую SQL 2014
2 ответов:
Это, кажется, дает желаемые результаты. При попытке овладеть навыками написания SQL, наиболее полезно попытаться думать в терминах всего набора результатов, а не думать о "построчной" обработке.
Таким образом, я переформулировал вашу спецификацию следующим образом:
EVENT_SEQчисло событийsomething, происходящих до или в текущей строке, +1declare @t table (ITEM char(4), [Date] date, [Event] varchar(9)) insert into @T(ITEM,[DATE],[EVENT]) values ('blah','20150101','nothing'), ('blah','20150102','nothing'), ('blah','20150103','nothing'), ('blah','20150104','something'), ('blah','20150105','nothing'), ('blah','20150106','nothing'), ('blah','20150107','something'), ('blah','20150108','nothing'), ('blah','20150109','nothing'), ('blah','20150110','nothing'), ('blah','20150111','nothing'), ('blah','20150112','something'), ('blah','20150113','something'), ('blah','20150114','nothing'), ('blah','20150115','nothing'), ('blah','20150116','nothing'), ('blah','20150117','nothing'), ('blah','20150118','nothing'), ('blah','20150119','nothing'), ('blah','20150120','something'), ('blah','20150121','something'), ('blah','20150122','nothing') select *, SUM(CASE WHEN [event]='something' THEN 1 ELSE 0 END) OVER (ORDER BY item,date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)+1 as EVENT_SEQ from @t ORDER BY item,dateГде вы можете с надеждой увидеть, что я перевел его почти непосредственно в оконный агрегат функция (
SUM() OVER()). Результаты:ITEM Date Event EVENT_SEQ ---- ---------- --------- ----------- blah 2015-01-01 nothing 1 blah 2015-01-02 nothing 1 blah 2015-01-03 nothing 1 blah 2015-01-04 something 2 blah 2015-01-05 nothing 2 blah 2015-01-06 nothing 2 blah 2015-01-07 something 3 blah 2015-01-08 nothing 3 blah 2015-01-09 nothing 3 blah 2015-01-10 nothing 3 blah 2015-01-11 nothing 3 blah 2015-01-12 something 4 blah 2015-01-13 something 5 blah 2015-01-14 nothing 5 blah 2015-01-15 nothing 5 blah 2015-01-16 nothing 5 blah 2015-01-17 nothing 5 blah 2015-01-18 nothing 5 blah 2015-01-19 nothing 5 blah 2015-01-20 something 6 blah 2015-01-21 something 7 blah 2015-01-22 nothing 7
Этот запрос можно использовать для вставки данных во временную таблицу
select Item,[Date] ,[Event], SUM(CASE WHEN event = 'something' THEN 1 ELSE 0 END) OVER (ORDER BY Item,date )+1 as sequence INTO #tempTable from MyData ORDER BY item,date
Comments