Вопрос:

Как создать порядковый номер для конкретных учетных записей, представленных в таблице

sql sql-server-2008

52 просмотра

1 ответ

6 Репутация автора

У меня такая ситуация: если учетная запись отсутствует в другой таблице (table2), то приведенный ниже запрос сгенерирует следующий номер 1, в противном случае он должен сгенерировать порядковый порядковый номер для всех учетных записей того же типа.

Запрос:

select 
account_ID,
(case when (B.seq) is null then 1 else B.seq+1 end) as col1,
desc as desc
from table1
left join 
(select id, max(seq_no) seq from table2 group by id) B
on table1.id=B.id

:Таблица 2:

ID    account_id     seq_no
1      100            1
1      100            2
2      101            1

Ожидаемый результат нужен от запроса table1: ----------

account_id    col1     desc
102             1       abc
102             2       xyz
102             3       apc
100             3       pqr
100             4       mn
101             2       home
101             3       hall

Пожалуйста, помогите мне получить этот результат в запросе SQL Server. Заранее спасибо.

Автор: nihal Источник Размещён: 22.08.2016 09:39

Ответы (1)


0 плюса

6274 Репутация автора

Исходя из вашего вопроса, я думаю, что вы запрашиваете порядковый номер для каждого account_id, который будет начинаться на одно значение после максимального значения в Table2, но будет увеличиваться независимо от того, сколько записей в Table1.

Запрос ниже использует ROW_NUMBER()функцию для создания последовательности. PARTITION BYДелает его «сбросить» себя один раз в ACCOUNT_ID, и ORDER BYрассказывает , какие строки приходят первые в последовательности (обратите внимание , что вы не указали , каким образом они должны быть отсортированы в исходном сообщении, и , таким образом , я выбрал поле описания случайным образом ).

Я использовал то же LEFT JOINусловие для определения максимальной последовательности, доступной для этого account_id, и добавил ее к ROW_NUMBER()значению, если оно уже существует. ISNULL()Предназначен для обработки любых значений account_ID , которые еще не имеют последовательность.

DECLARE @Table1 TABLE (account_id INT, descr VARCHAR(4))
DECLARE @Table2 TABLE (ID INT, account_id INT, seq_no INT)

INSERT INTO @Table1 (account_id,descr)
    SELECT 102, 'abc' UNION 
    SELECT 102, 'xyz' UNION 
    SELECT 102, 'apc' UNION 
    SELECT 100, 'pqr' UNION 
    SELECT 100, 'mn' UNION 
    SELECT 101, 'home' UNION 
    SELECT 101, 'hall'


INSERT INTO @Table2 (account_id,seq_no)
    SELECT 100, 1 UNION 
    SELECT 100, 2 UNION 
    SELECT 101, 1

SELECT
    a.account_id
   ,ROW_NUMBER() OVER (PARTITION BY a.account_id ORDER BY descr) + ISNULL(b.seq,0) AS col1
   ,a.descr AS descr
FROM @Table1 a
    LEFT JOIN
     (
         SELECT
             [@Table2].account_id
            ,MAX([@Table2].seq_no) seq
         FROM @Table2
         GROUP BY [@Table2].account_id
     ) B
        ON a.account_id = B.account_id

Обратите внимание, что вам придется адаптировать код к вашим собственным именам таблиц / столбцов и, возможно, уточнить ORDER BYвнутри секционированной функции: я привел общий пример.

Автор: AHiggins Размещён: 24.08.2016 01:44
Вопросы из категории :
32x32