Сравните значение строк в одном столбце и обновите флаг соответственно в таблице SQL-Server.

У меня есть одна таблица, как показано ниже

    A   B   C   D   E
2471    D471  0   24.00   1
2471    D471  0   353.50  1
2471    D471  1   211.00  1

2471    E471  1   343.00  1
2471    E471  0   56.00   1
2471    E471  0   177.06  1
2471    E471  0   9.31    1

2471    F471  0   10.31   1
2471    F471  1   10.31   1

Мне нужно сгруппировать по A, B и C и суммировать значение E, пример таблицы ниже, как это выглядит после суммирования

    A   B   C   E   SumValue
2471    D471  0   1 377.500000
2471    D471  1   1 211.000000

2471    E471  1   1 343.000000
2471    E471  0   1 242.370000

2471    F471  0   1 10.31
2471    F471  1   1 10.31

Мне нужно сравнить SumValue, сгруппировав A, B, C первой строки, в которой C имеет 0, и второй строки, в которой C имеет 1, и которая когда-либо имеет самое низкое значение, эти записи должны быть равны 1 в столбце E, остальные записи должны прийти как 0 в столбце Е. Если SumValue одинаково, тогда как в последних двух строках столбец E должен быть равен 1, где C равно 1, а столбец E должен быть равен 0, где C равно 0.

Вывод, который мне нужен, выглядит следующим образом ... Все, что мне нужно сделать в этом сценарии, это обновить столбец E ...

    A   B   C   D   E
2471    D471  0   24.00   0
2471    D471  0   353.50  0
2471    D471  1   211.00  1

2471    E471  1   343.00  0
2471    E471  0   56.00   1
2471    E471  0   177.06  1
2471    E471  0   9.31    1

2471    F471  0   10.31   0
2471    F471  1   10.31   1

Скрипты для создания таблицы и вставки данных

CREATE TABLE tablename
    ([A] int, [B] varchar(10), [C] int, [D] decimal(10, 2), [E] int)
;

INSERT INTO tablename
    ([A], [B], [C], [D], [E])
VALUES
    (2471, 'D471', 0, 24.00, 1),
    (2471, 'D471', 0, 353.50, 1),
    (2471, 'D471', 1, 211.00, 1),
    (2471, 'E471', 1, 343.00, 1),
    (2471, 'E471', 0, 56.00, 1),
    (2471, 'E471', 0, 177.06, 1),
    (2471, 'E471', 0, 9.31, 1),
    (2471, 'F471', 0, 10.31, 1),
    (2471, 'F471', 1, 10.31, 1)
;

Если у вас есть какие-либо вопросы по этому запросу, пожалуйста, дайте мне знать

Всего 1 ответ


Если я правильно понимаю:

with toupdate as (
      select t.*,
             dense_rank() over (partition by a, b order by sum_d, c desc) as seqnum
      from (select t.*, sum(d) over (partition by a, b, c) as sum_d
            from tablename t
           ) t
     )
update toupdate
    set e = (case when seqnum = 1 then 1 else 0 end);

Есть идеи?

10000