Как получить различие между двумя строками для поля столбца?

Первоначальный вопрос: расщепление и усреднение по разным затемнениям

Среднее значение может быть применено до расщепления, которое сводит данные в вектор, а затем accumarray [ 116] можно использовать:

binned_data = accumarray(repelem(1:numel(bins), bins).', mean(data,2), [], @(x){x.'});

Отредактированный вопрос: расщепление и усреднение по одинаково dim

accumarray 1 sup> не работает с матричными данными. Но вы можете использовать sparse , который автоматически накапливает значения данных, соответствующие тем же индексам:

ind_rows = repmat(repelem((1:numel(bins)).', bins), 1, size(data,2));
ind_cols = repmat(1:size(data,2), size(data,1), 1);
binned_data = sparse(ind_rows, ind_cols, data);
binned_data = bsxfun(@rdivide, binned_data, bins(:));
binned_data = num2cell(binned_data, 2).';

Но splitapply делает. См. @ Ответ Вулфи . SUP>

54
задан David.Chu.ca 5 October 2015 в 01:11
поделиться

6 ответов

SELECT
   [current].rowInt,
   [current].Value,
   ISNULL([next].Value, 0) - [current].Value
FROM
   sourceTable       AS [current]
LEFT JOIN
   sourceTable       AS [next]
      ON [next].rowInt = (SELECT MIN(rowInt) FROM sourceTable WHERE rowInt > [current].rowInt)

РЕДАКТИРОВАНИЕ: Взгляды об этом, с помощью подзапроса в выборе (ответ Quassnoi крыла) могут быть более эффективными. Я испытал бы различные версии и посмотрел бы на планы выполнения для наблюдения, который будет работать лучше всего на размере набора данных, который Вы имеете...

55
ответ дан MatBailie 7 November 2019 в 07:56
поделиться
SELECT rowInt, Value,
       COALESCE(
       (
       SELECT TOP 1 Value
       FROM myTable mi
       WHERE mi.rowInt > m.rowInt
       ORDER BY
             rowInt
       ), 0) - Value AS diff
FROM  myTable m
ORDER BY
      rowInt
25
ответ дан Quassnoi 7 November 2019 в 07:56
поделиться

Если Вы действительно хотите быть уверенными в заказах, используйте "Row_Number ()" и сравните, следующая запись текущей записи (внимательно изучите "на" пункте)

T1.ID + 1 = T2.ID

, Вы в основном присоединяетесь к следующей строке с текущей строкой, не определяя "минуту" или делая "вершину". Если у Вас будет небольшое количество записей, то другие решения "демократами" или "Quassanoi" будут хорошо работать.

with T2 as (
    select  ID = ROW_NUMBER() over (order by rowInt),
            rowInt, Value
    from    myTable
)
select  T1.RowInt, T1.Value, Diff = IsNull(T2.Value, 0) - T1.Value
from    (   SELECT  ID = ROW_NUMBER() over (order by rowInt), *
            FROM    myTable ) T1
        left join T2 on T1.ID + 1 = T2.ID
ORDER BY T1.ID
11
ответ дан dance2die 7 November 2019 в 07:56
поделиться

Аналитические функции поддержки SQL Server?

select   rowint,
         value,
         value - lag(value) over (order by rowint) diff
from     myTable
order by rowint
/
2
ответ дан David Aldridge 7 November 2019 в 07:56
поделиться

Я просто сделал бы немного функции для этого. Встряхните в двух значениях, между которыми необходимо знать различие и иметь его, вычитают меньшее из большего значения. Что-то как:

CREATE FUNCTION [dbo].[NumDifference] 
    (   @p1 FLOAT,
        @p2 FLOAT )
RETURNS FLOAT
AS
BEGIN
    DECLARE @Diff FLOAT
    IF @p1 > @p2 SET @Diff = @p1 - @p2 ELSE SET @Diff = @p2 - @p1
    RETURN @Diff
END

В запросе для получения различия между столбцом a и b:

SELECT a, b, dbo.NumDifference(a, b) FROM YourTable
0
ответ дан 7 November 2019 в 07:56
поделиться
select t1.rowInt,t1.Value,t2.Value-t1.Value as diff
from (select * from myTable) as t1,
     (select * from myTable where rowInt!=1
      union all select top 1 rowInt=COUNT(*)+1,Value=0 from myTable) as t2
where t1.rowInt=t2.rowInt-1
0
ответ дан 7 November 2019 в 07:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: