【问题标题】:SQL Query using distinct and max使用 distinct 和 max 的 SQL 查询
【发布时间】:2011-10-31 19:27:16
【问题描述】:

我有一个像这样的数据集:

 type    seqID    text     
 A       1        Text1a
 A       2        Text2a
 A       3        Text3a
 B       1        Text1b
 B       2        Text2b

如何按类型取回具有按类型分组的最高 seqID 的行?因此,在上面的示例中,我希望返回具有 A、3、Text3a 和 B、2、Text2b 的行。

【问题讨论】:

  • 您使用的是哪个服务器? mysql/oracle/sql 服务器?
  • 不应该是“所以在上面的例子中我想要有 A, 3, Text3a 的行”而不是“ 所以在上面的例子中我想要有 A, 3 的行, Text3a 和 B, 2, Text2b 返回。” ??
  • 不,我希望 b, 2, Text2b 也返回
  • @chris ,在投票之前,您可能想澄清这个问题。我们在这里互相帮助!
  • @chris :我理解了这个问题(您需要每种类型的最大 seqID 行)。看看我的解决方案现在是否适合你。

标签: sql select subquery distinct max


【解决方案1】:
SELECT *  
FROM tmp t1  
WHERE NOT EXISTS  
(SELECT 1 FROM tmp t2 WHERE t1.type = t2.type AND t2.seqID > t1.seqID)  

它不应该存在具有相同类型和更高 seqID 的任何其他行。

【讨论】:

    【解决方案2】:

    你有点需要一个 ID,但因为“文本”对于这个例子来说似乎是独一无二的

    CREATE TABLE #TMP 
     (type VARCHAR(3),   seqID  INT,   [text] varchar(256))
    insert #TMP values ('A'   ,    1   ,     'Text1a')
    insert #TMP values ('A'   ,    2   ,     'Text2a')
     insert #TMP values ('A'   ,    3   ,     'Text3a')
     insert #TMP values ('B'   ,    1   ,     'Text1b')
     insert #TMP values ('B'   ,    2   ,     'Text2b')
    
    
    SELECT * FROM #TMP T
    where [text] IN
        (SELECT TOP 1 [text] FROM #TMP t2 WHERE t.type = t2.type ORDER BY t2.seqID DESC)
    

    【讨论】:

      【解决方案3】:
      SELECT tbl.*
      FROM
         ( SELECT type, MAX(seqID)
           FROM tbl
           GROUP BY type) maxes
      WHERE
         tbl.type= maxes.type AND
         tbl.seqID= maxes.seqID
      

      【讨论】:

        【解决方案4】:
        SELECT t.* FROM
        (
           SELECT type, MAX(seqID) as maxId 
           FROM Table
           GROUP BY type
        ) m
        INNER JOIN Table t ON m.maxId = t.seqId 
        

        使用 CTE

        ;WITH maxIds(maxId)
        AS
        (
           SELECT type, MAX(seqID) as maxId 
           FROM Table
           GROUP BY type
        )
        SELECT t.* FROM
        Table t
        INNER JOIN maxIds m ON m.maxId = t.seqID
        

        【讨论】:

          【解决方案5】:

          如果您使用的是 SQL Server 2005+,则可以使用 ranking function(更具体地说,ROW_NUMBER()):

          SELECT
            type,
            seqID,
            text
          FROM (
            SELECT
              *,
              rnk = ROW_NUMBER() OVER (PARTITION BY type ORDER BY seqID DESC)
            FROM atable
          ) s
          WHERE rnk = 1
          

          【讨论】:

            【解决方案6】:
            create table #tlb1(
            [type] VARCHAR(3), seqID  INT, [text] varchar(max)
            )
            
            declare @type varchar(3), @text varchar(max);
            declare @seqID int;
            declare seq_cursor cursor for 
            select [type], max(seqID) from tbl group by [type]
            open seq_cursor
            fetch next from seq_cursor into @type,@seqID
            while(@@fetch_status=0)
            begin
                set @text= (select [text] from tbl where [type]=@type and seqID=@seqid);
                insert into #tlb1 values (@type, @seqID,@text);
                fetch next from seq_cursor into @type,@seqID    
            end
            select * from #tlb1
            close seq_cursor
            deallocate seq_cursor
            truncate table #tlb1
            

            【讨论】:

              【解决方案7】:

              试试:

              SELECT type, max(seqID),text 
              FROM 'db'
              GROUP BY type
              

              就这么简单。

              【讨论】:

                【解决方案8】:

                编辑的解决方案。考虑这是一个伪代码(因为我不熟悉 SQL 服务器语法):

                SELECT a.type, a.seqID, a.text FROM table a
                 JOIN
                (SELECT type, max(seqID) seqID FROM table GROUP BY type) b 
                ON a.seqID = b.seqID AND a.type=b.type
                

                【讨论】:

                • LIMIT 不是 Sql Server 函数
                • 这行不通,它不会只返回 seqID 3 的 B、2、Text2b 数据行
                • @sll :我的回答说'如果'LIMIT 被支持,那么你可以使用它。 'not Sql Server' 功能是什么意思? OP 是否在谈论特定的数据库服务器类型?我没有在他/她的问题中看到它。
                猜你喜欢
                • 2020-12-24
                • 1970-01-01
                • 2015-03-11
                • 2013-10-01
                • 2013-03-08
                • 2012-10-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多