SQL-запрос с использованием различных и макс. - PullRequest
0 голосов
/ 31 октября 2011

У меня есть такой набор данных:

 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.

Ответы [ 8 ]

1 голос
/ 07 мая 2013
SELECT *  
FROM tmp t1  
WHERE NOT EXISTS  
(SELECT 1 FROM tmp t2 WHERE t1.type = t2.type AND t2.seqID > t1.seqID)  

Не должно быть другой строки с таким же типом и более высоким seqID.

0 голосов
/ 03 ноября 2011
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
0 голосов
/ 15 апреля 2013

Попробуйте:

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

Так просто.

0 голосов
/ 01 ноября 2011

Если вы используете SQL Server 2005+, вы можете использовать функцию ранжирования (точнее, 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
0 голосов
/ 31 октября 2011
SELECT tbl.*
FROM
   ( SELECT type, MAX(seqID)
     FROM tbl
     GROUP BY type) maxes
WHERE
   tbl.type= maxes.type AND
   tbl.seqID= maxes.seqID
0 голосов
/ 31 октября 2011

Вам как бы нужен идентификатор, но так как «Текст» кажется уникальным для этого примера

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)
0 голосов
/ 31 октября 2011

РЕДАКТИРОВАННОЕ решение.Считайте это псевдо-кодом (поскольку я не знаком с синтаксисом 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
0 голосов
/ 31 октября 2011
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
...