Выбор значения по МАКС другого столбца

rtyts
Дата: 14.01.2009 19:15:26
CREATE TABLE [dbo].[tmp_tbl](
	[IX] [int] NOT NULL,
	[ID_Product] [int] NOT NULL,
	[Mark] [int] NOT NULL
) ON [PRIMARY]

INSERT INTO [DB_PowerReg].[dbo].[tmp_tbl] ([IX],[ID_Product],[Mark]) VALUES(1,1,1)
INSERT INTO [DB_PowerReg].[dbo].[tmp_tbl] ([IX],[ID_Product],[Mark]) VALUES(2,1,100)
INSERT INTO [DB_PowerReg].[dbo].[tmp_tbl] ([IX],[ID_Product],[Mark]) VALUES(3,1,200)
INSERT INTO [DB_PowerReg].[dbo].[tmp_tbl] ([IX],[ID_Product],[Mark]) VALUES(4,1,300)
INSERT INTO [DB_PowerReg].[dbo].[tmp_tbl] ([IX],[ID_Product],[Mark]) VALUES(1,2,1)
INSERT INTO [DB_PowerReg].[dbo].[tmp_tbl] ([IX],[ID_Product],[Mark]) VALUES(2,2,100)
INSERT INTO [DB_PowerReg].[dbo].[tmp_tbl] ([IX],[ID_Product],[Mark]) VALUES(3,2,200)
INSERT INTO [DB_PowerReg].[dbo].[tmp_tbl] ([IX],[ID_Product],[Mark]) VALUES(1,3,8)
INSERT INTO [DB_PowerReg].[dbo].[tmp_tbl] ([IX],[ID_Product],[Mark]) VALUES(2,3,700)
INSERT INTO [DB_PowerReg].[dbo].[tmp_tbl] ([IX],[ID_Product],[Mark]) VALUES(3,3,600)
INSERT INTO [DB_PowerReg].[dbo].[tmp_tbl] ([IX],[ID_Product],[Mark]) VALUES(4,3,255)

Нужно для ID_Product выбрать такой Mark для которого IX максимален.
То есть в результате запроса для ID_Product=1 нужно получить 300, для ID_Product=2 - 200, для ID_Product=3 - 255.
Как бы это пооптимальнее?
el Pueblo
Дата: 14.01.2009 19:27:59
Для 2005

with cte as
(
	select row_number() over (partition by id_product order by [IX] desc) as _id, [IX], [ID_Product], [Mark]
	from [DB_PowerReg].[dbo].[tmp_tbl]
)
select [IX], [ID_Product], [Mark] from cte where _id=1
Ken@t
Дата: 14.01.2009 19:33:01
Сервер угадать надо ?
select top 1 with ties
 ID_Product
 ,Mark
 ,IX
from tmp_tbl 
 ORDER BY 
ROW_NUMBER() over ( PARTITION BY ID_Product
  ORDER BY ID_Product 
 ,IX DESC)
RADDD
Дата: 14.01.2009 19:47:47
SELECT DISTINCT [tmp_tbl].[ID_Product], [tmp_tbl].[Mark]
FROM [tmp_tbl]
INNER JOIN
  (SELECT MAX([IX]) As MAX_IX, [ID_Product]
   FROM [tmp_tbl]
   GROUP BY [ID_Product]) a 
 ON ([tmp_tbl].[ID_Product] = a.[ID_Product]) AND ([dbo].[tmp_tbl].[IX] = a.[MAX_IX])
rtyts
Дата: 14.01.2009 23:48:48
Ken@t
Сервер угадать надо ?
Виноват
My MS SQL SERVER
Microsoft SQL Server 2005 - 9.00.3073.00 (Intel X86)
Aug 5 2008 12:31:12
Copyright (c) 1988-2005 Microsoft Corporation
Standard Edition on Windows NT 5.1 (Build 2600: Service Pack 2)

Мой вариант был как у RADDD. Но чего-то он не кажется мне оптимальным. А cte быстрее работает? Ну так по статистике?...а то нет возможности поэксперементировать в данный момент.
Змей
Дата: 15.01.2009 10:37:58
rtyts,

а может "классически"? :)

сначала так:
create /*unique*/ index tmp_tbl_k2 on dbo.tmp_tbl(ID_Product, IX)
а потом так:
select
      IX
    , ID_Product
    , Mark
from 
    dbo.tmp_tbl t
where 
    IX = (SELECT MAX([IX]) FROM dbo.tmp_tbl where ID_Product =  t.ID_Product) 
rtyts
Дата: 15.01.2009 16:17:42
Скажите, а где посмотреть время выполнения запроса, чтобы оценить скорость выполнения вариантов Ken@t, Змей, RADDD. Я вот циклом наполнил таблицу до 1000000 записей и у меня все варианты выполняются 1 секунду, судя по секундомеру в MS SSMS справа внизу. Смотрел план запроса там чего-то все цифры одинаковые...Куда смотреть чтоб оценить скорость выполнения запроса?
Ken@t
Дата: 15.01.2009 16:20:15
SET STATISTICS IO ON
SET STATISTICS TIME ON

как будто первый раз скуль увидели., чесослово ну и план заодно посмотртите
rtyts
Дата: 15.01.2009 16:30:22
Классика от Змей
Мой скуль
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 1 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 1 ms.

(1 row(s) affected)
Table 'tmp_tbl'. Scan count 2, logical reads 3404, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 78 ms, elapsed time = 81 ms.


А это хваленые cte

Мой скуль
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 1 ms.
SQL Server parse and compile time:
CPU time = 14 ms, elapsed time = 14 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 1 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 1 ms.

(1 row(s) affected)
Table 'tmp_tbl'. Scan count 2, logical reads 3404, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

SQL Server Execution Times:
CPU time = 94 ms, elapsed time = 105 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 1 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 1 ms.

Получаеццо классика лучше?
Ken@t
Дата: 15.01.2009 16:33:27
запросы одинаковые, различное время компиляции, планы покажите