【问题标题】:Got Error in Retrieving results using group by and order by in SQL server 2008在 SQL Server 2008 中使用 group by 和 order by 检索结果时出错
【发布时间】:2015-03-06 05:07:25
【问题描述】:

我有一个名为 Scripts 的表,其中包含修改过的过程、函数和表的数据。

CREATE TABLE #Scripts
    (
    ID              NUMERIC (18) IDENTITY NOT NULL, 
    [Date]          DATETIME NULL,
    DatabaseName    VARCHAR (50) NULL,
    Name            VARCHAR (100) NULL,
    Type            VARCHAR (20) NULL,
    Action          VARCHAR (50) NULL,
    Description     VARCHAR (500) NULL,
    ModifiedBy      VARCHAR (50) NULL,      
    AddedTimestamp  DATETIME NULL,
    UpdateTimestamp DATETIME NULL,  
    )
GO

我将记录添加到表中,如下所示。这些只是示例记录。

INSERT INTO #Scripts ([Date], DatabaseName, Name, Type, Action, Description, ModifiedBy, AddedTimestamp, UpdateTimestamp)
VALUES ('2015-01-07 11:16:41.4', 'Test', 'sp_GetData', 'Stored Procedure', 'Created', 'To Get ActivitySubscriptions for Mobile from tblSubscriptions', 'dinesh.alla', '2015-01-07 11:39:39.703', '2015-01-07 11:39:39.703')
GO

INSERT INTO #Scripts ([Date], DatabaseName, Name, Type, Action, Description, ModifiedBy, AddedTimestamp, UpdateTimestamp)
VALUES ('2015-01-07 11:16:41.4', 'Test', 'sp_GetData', 'Stored Procedure', 'Updated', 'To Get ActivitySubscriptions for Mobile from tblSubscriptions', 'dinesh.alla', '2015-01-07 11:39:39.703', '2015-01-07 11:39:39.703')
GO


INSERT INTO #Scripts ([Date], DatabaseName, Name, Type, Action, Description, ModifiedBy, AddedTimestamp, UpdateTimestamp)
VALUES ('2015-01-07 11:16:41.4', 'Test', 'sp_GetData', 'Stored Procedure', 'Deleted', 'To Get ActivitySubscriptions for Mobile from tblSubscriptions', 'dinesh.alla', '2015-01-07 11:39:39.703', '2015-01-07 11:39:39.703')
GO

INSERT INTO #Scripts ([Date], DatabaseName, Name, Type, Action, Description, ModifiedBy, AddedTimestamp, UpdateTimestamp)
VALUES ('2015-01-07 11:16:41.4', 'Test', 'sp_UpdateData', 'Stored Procedure', 'Created', 'To Get ActivitySubscriptions for Mobile from tblSubscriptions', 'dinesh.alla', '2015-01-07 11:39:39.703', '2015-01-07 11:39:39.703')
GO

INSERT INTO #Scripts ([Date], DatabaseName, Name, Type, Action, Description, ModifiedBy, AddedTimestamp, UpdateTimestamp)
VALUES ('2015-01-07 11:16:41.4', 'Test', 'sp_UpdateData', 'Stored Procedure', 'Updated', 'To Get ActivitySubscriptions for Mobile from tblSubscriptions', 'dinesh.alla', '2015-01-07 11:39:39.703', '2015-01-07 11:39:39.703')
GO

INSERT INTO #Scripts ([Date], DatabaseName, Name, Type, Action, Description, ModifiedBy, AddedTimestamp, UpdateTimestamp)
VALUES ('2015-01-07 11:16:41.4', 'Test', 'sp_AddData', 'Stored Procedure', 'Created', 'To Get ActivitySubscriptions for Mobile from tblSubscriptions', 'dinesh.alla', '2015-01-07 11:39:39.703', '2015-01-07 11:39:39.703')
GO

我尝试得到如下所示的结果

SELECT MAX(ID) AS ID,MAX(Action) AS Action 
FROM #Scripts GROUP BY Name ORDER BY ID ASC

输出:

ID     Action
3      Updated
5      Updated
6      Created

预期输出:

ID     Action
3      Deleted
5      Updated
6      Created

【问题讨论】:

  • 为什么要返回“已删除”?您是否要执行最后一个操作?那为什么不直接使用“SELECT TOP 1 * FROM #Scripts WHERE [Name] = 'sp_GetData' ORDER BY [ID] DESC”
  • 当您要求max(action) 时,它会按字母顺序对其进行排序,这就是为什么显示updated 而不是deleted。只需使用max(id)进行排序
  • 问题是您尝试使用 Max(string) 尝试在 varchar 上应用 max 函数,所以它会给出类似上面的输出,因为您什么时候将值 a,b 放入表中然后尝试取最大值然后它将显示 b

标签: sql sql-server database sql-server-2008 select


【解决方案1】:

试试这个:

 select distinct sc.action,sc.ID from (
  SELECT MAX(ID)  OVER(PARTITION BY NAME  ) rn,*  FROM #Scripts  
  )d  join #Scripts sc
  on d.rn=sc.ID
 order by sc.ID

输出

action  ID
Deleted 3
Updated 5
Created 6

【讨论】:

  • 这是不可能的。每次它只会返回一条记录。我在 NAME 列中有不同的名称。
  • @Dineshalla 为您的问题和输出添加更多示例
  • 现在我想你明白我的情况了。 @Ganesh_Devlekar
  • 谢谢。其余查询也可以正常工作,但您的查询优化了我的选择查询的大部分。 @Ganesh_Devlekar
【解决方案2】:

假设如果您将两个动作设置为 'a' 和 'z' .. 那么 select max(Actions) 的结果就是 z

如果你想要预期的输出,那么你可以尝试这样的事情

select TOP 1 MAX(ID) AS ID ,Action
FROM #Scripts where Name = 'sp_GetData'
GROUP BY Action
ORDER BY MAX(ID) DESC

请通过this链接你会得到这个概念

【讨论】:

    【解决方案3】:
    ;WITH LatestChanges AS
    (
        SELECT  S.[ID], S.[Date], S.[DatabaseName], S.[Name], S.[Type], S.[Action], S.[Description],
                S.[ModifiedBy], S.[AddedTimestamp], S.[UpdateTimestamp],
                [RowNum] = ROW_NUMBER() OVER (PARTITION BY S.[Name] ORDER BY S.[ID] DESC)
        FROM    [#Scripts] S
    )
    SELECT  *
    FROM    LatestChanges
    WHERE   [RowNum] = 1
    ORDER BY ID
    

    这将返回每个 [Name] 的最后一个 [ID]。

    【讨论】:

      【解决方案4】:

      试试这个,

      SELECT * FROM 
      (
         SELECT *,
         ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY ID DESC )RN
         FROM @Scripts 
      )T4
      WHERE RN=1
      

      【讨论】:

        猜你喜欢
        • 2018-11-27
        • 2015-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多