Nossa tabela armazena os números das linhas de um pedido. É possível concatená-los em uma string, onde a primeira e a última linhas sequenciais são separadas por um hífen e as linhas não sequenciais são separadas por uma vírgula? Alguns de nossos pedidos podem ter mais de 100 linhas do mesmo item e, em vez de listar cada linha separadamente, gostaríamos de condensá-las em "Linhas: 1-100" ou "Linhas: 1-20, 25, 30-50, 75-100", etc.
Fonte
Linha | Item |
---|---|
1 | Maçã |
2 | Maçã |
3 | Maçã |
4 | Laranja |
5 | Maçã |
6 | Laranja |
7 | Maçã |
8 | Maçã |
9 | Laranja |
10 | Laranja |
Consulta atual
Usando STRING_AGG, consegui agrupá-los por linhas individuais, mas não consigo descobrir como identificar as partes sequenciais e extrair seus primeiros/últimos valores para o hífen. LAG e LEAD podem ser usados em conjunto com STRING_AGG?
SELECT
CONCAT('Lines: ', STRING_AGG(Line, ', ') WITHIN GROUP (ORDER BY Line)) AS [Line],
Item
FROM Table
GROUP BY Item
Resultado atual
Linha | Item |
---|---|
Linhas: 1, 2, 3, 5, 7, 8 | Maçã |
Linhas: 4, 6, 9, 10 | Laranja |
Resultado desejado
Linha | Item |
---|---|
Linhas: 1-3, 5, 7-8 | Maçã |
Linhas: 4, 6, 9-10 | Laranja |
Isso parece uma lacuna e uma ilha. Aqui está uma solução potencial:
O diff row_number calcula os "agrupamentos" de cada item e, então, o restante apenas cria um rótulo apropriado, uma única linha ou um intervalo de linhas se count(*) > 1.
Por fim, o STRING_AGG junta tudo.
Na sua solução real, você provavelmente também precisará agrupar/particionar por OrderNumber.
Saída de exemplo: