SQL получает уникальные записи и поддерживает порядок - PullRequest
0 голосов
/ 07 мая 2019

В моей таблице есть записи, подобные приведенным ниже.

enter image description here

Я хочу отличные записи, и когда я делаю группу по ним, теряет порядок. Я хочу поддерживать порядок. Я хочу результаты, как показано ниже:

enter image description here

Это мой запрос:

select route_id,fixcode,fixdescription 
from route_fixcodes 
group by route_id,fixcode,fixdescription 
having route_id = 995063

Ответы [ 4 ]

0 голосов
/ 08 мая 2019

следующий запрос дал мне желаемое решение.

выберите route_id, код исправления, описание исправления, MIN (id) в качестве minid из route_fixcodes, где route_id = @RouteId GROUP BY route_id, код исправления, описание исправления Порядок по minid

0 голосов
/ 07 мая 2019

Попробуйте следующий код.Я думаю, это то, что вы ищете

CREATE TABLE [dbo].[route_fixcodes](
    [route_id] [INT] NULL,
    [fixcode] [INT] NULL,
    [fixdescription] [NVARCHAR](50) NULL
) ON [PRIMARY]

GO

INSERT INTO [route_fixcodes]
([route_id] ,[fixcode],[fixdescription])
VALUES
(995063,100,'Issue Observed'),
(995063,137,'Swap Altice One Pack'),
(995063,249,'Defective CPE Equip.'),
(995063,112,'Outside coax repair'),
(995063,258,'Preventative Maint'),
(995063,100,'Issue Observed'),
(995063,137,'Swap Altice One Pack'),
(995063,249,'Defective CPE Equip.'),
(995063,112,'Outside coax repair'),
(995063,258,'Preventative Maint'),
(995063,100,'Issue Observed'),
(995063,137,'Swap Altice One Pack'),
(995063,249,'Defective CPE Equip.'),
(995063,112,'Outside coax repair'),
(995063,258,'Preventative Maint')
GO


SELECT * INTO #route_seq FROM dbo.route_fixcodes


ALTER TABLE #route_seq ADD seq  [INT] IDENTITY(1,1)

SELECT MIN(seq) AS newseq,  route_id,fixcode,fixdescription 
FROM #route_seq
group by route_id,fixcode,fixdescription 
ORDER BY MIN(seq)
0 голосов
/ 07 мая 2019

Таблицы SQL представляют неупорядоченные наборы.Порядка нет, если только в столбце не указан порядок.

Позвольте мне предположить, что он есть.,,Я просто назову это id.Затем вы можете сделать:

select route_id, fixcode, fixdescription 
from route_fixcodes 
where route_id = 995063
group by route_id, fixcode, fixdescription 
order by min(id);

Обратите внимание, что я изменил предложение having на предложение where.В целом, это сократит объем агрегируемых данных - и это очень хорошо для производительности.

Если у вас нет столбца порядка, но вам нужны результаты в порядке 100, 137, 249,112, 258, тогда вы можете использовать выражение case или аналогичную логику:

select route_id, fixcode, fixdescription 
from route_fixcodes 
where route_id = 995063
group by route_id, fixcode, fixdescription 
order by charindex(id, '100,137,249,112,258');

(Это просто удобное сокращение, которое не будет работать при любых обстоятельствах, но работает с предоставленными вами данными.)

0 голосов
/ 07 мая 2019

Просто добавьте отчетливый:

select distinct route_id,fixcode,fixdescription 
from route_fixcodes 
group by route_id,fixcode,fixdescription 
having route_id = 995063
...