【问题标题】:SQL get unique records and Maintain the OrderSQL获取唯一记录并维护订单
【发布时间】:2019-05-07 08:32:41
【问题描述】:

我的表中有如下记录。

我想要不同的记录,当我按它分组时,它会丢失顺序。我要维持秩序。我想要如下结果:

这是我的查询:

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

【问题讨论】:

  • 您缺少order by 子句,只需添加即可。
  • @DaleBurrell 他希望将行显示为屏幕截图,不要使用 order by
  • 您的原始数据没有顺序保存...
  • 唯一可以确保其顺序正确的方法,即使那是插入的顺序,也是使用order by 子句。如果您希望按插入顺序进行排序,则需要一个递增的 ID 字段或一个日期字段来进行排序。插入顺序没有任何意义。
  • 如果没有 ORDER BY,则不会对结果进行排序。从向原始查询添加 ORDER BY 子句开始!

标签: sql sql-server group-by sql-order-by distinct


【解决方案1】:

试试下面的代码。我想这就是你要找的东西

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)

【讨论】:

  • 这没有帮助吗?
【解决方案2】:

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');

(这只是一种方便的简写方式,并不适用于所有情况,但适用于您提供的数据。)

【讨论】:

  • 下面的查询给了我想要的结果。 select route_id,fixcode,fixdescription, MIN(id) as minid from route_fixcodes where route_id = @RouteId GROUP BY route_id,fixcode,fixdescription Order by minid
【解决方案3】:

下面的查询给了我想要的解决方案。

select route_id,fixcode,fixdescription, MIN(id) as minid from route_fixcodes where route_id = @RouteId GROUP BY route_id,fixcode,fixdescription 按minid排序

【讨论】:

    【解决方案4】:

    只需添加不同的:

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

    【讨论】:

    • SELECT DISTINCT instead of GROUP BY 看起来不错,但订单不会被保留,因为它没有订单......
    • @jarlh。也许他还有其他需要 GROUP BY 的记录。
    • @ut 或:是的,正确的。我有需要分组的重复记录,但如果我使用 group by,它将默认排序为我不想要的按列分组。查询应该类似于 group by/distinct 但保持屏幕截图中显示的原始排序。
    • @kkakadiya 你不能在没有order by 子句的情况下保持原始排序。没有办法。这不可能。您必须指定顺序!
    • @kkakadiya。你想点什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多