2013-07-11 6 views
2

Я пытаюсь создать JOIN с 2 таблицами и иметь первый элемент объединенной таблицы.SQL Server SELECT first

Мои таблицы выглядеть следующим образом:

Продукт

id 
name 

продаж

idProduct 
prices 
date 

Я хочу иметь последнюю продажную цену для каждого продукта, но функцию FIRST Безразлично В SQL Server не существует.

У кого-то есть идея?

Спасибо,

+1

Это не может применить к SQL версии, но для SQL 2012 есть [функция FIRST_VALUE] (http://msdn.microsoft.com/en- us/library/hh213018.aspx), который, кажется, делает именно то, что вы хотите. Думал, это может быть полезно для кого-то. – GolfWolf

ответ

6

Вы можете использовать функцию ранжирования, как ROW_NUMBER:

WITH CTE AS(
    SELECT id, name, idProduct, prices, date, 
     RN = ROW_NUMBER() OVER (PARTITION BY idProduct ORDER BY date DESC) 
    FROM dbo.Product p INNER JOIN dbo.Sales s on p.id = s.idProduct 
) 
SELECT * FROM CTE WHERE RN = 1 

Ranking Functions (Transact-SQL)

CTE является common-table-expression похожа на суб-запрос, но более удобная для чтения и ремонтопригодна.

+0

Это все еще будет слишком медленным на огромных столах – makciook

+3

@makciook: Что мешает на огромных столах (что такое _huge_)? CTE медленны на «огромных» таблицах, если вы сами присоединяетесь к ним, вы должны избегать этого, если это возможно. Однако вышеприведенный запрос не должен быть медленным с соответствующими индексами. –

+0

Thank's Я использовал представление для CTE, и это работает – user2064192

-2

Если это SQL Server, просто используйте:

SELECT TOP 1 * 
FROM Product p 
JOIN Sales s ON p.id = s.idProduct 
ORDER BY s.Date DESC 
+1

Это ** не ** будет показывать первую (самую последнюю) продажу для каждого продукта - она ​​будет показывать только одну строку - самую последнюю продажу в целом. –

+0

Вы должны запустить код перед публикацией для других –