2015-05-18 1 views
0

Я выполнил запрос, но он выглядит уродливым. И главная проблема, я беспокоюсь, что производительность будет медленной., пожалуйста, помогите обновить этот простой, но уродливый запрос

Это мой стол:

ID  ProductCode   Qty  PYear  PMonth 
1   A1    4   2015  2 
2   A2    5   2015  2 
3   A3    2   2014  12 
4   A3    16   2015  4 

Я хочу, чтобы получить последние категории дат продают по каждому продукту, ниже результат, что я хочу:

ProductCode   Qty   Year  Month 
    A1    4   2015  2 
    A2    5   2015  2 
    A3    16   2015  4 

выглядит просто, но мой запрос сложно, я уверен, что для этого нужно простое решение, ниже мой запрос, с которым я работаю, я присоединился год и месяц к 1 колонке:

SELECT A.ProductCode, B.Qty, PDate 
FROM (
    SELECT MAX(ID) AS purchaseID, 
    ProductCode, 
    MAX(CAST(PYear AS VARCHAR(4)) + '-' + CAST(PMonthAS VARCHAR(2)) + '-1') AS PDate 
    FROM Table1 
    GROUP BY ProductCode 
) AS B 
LEFT JOIN Table1 AS B ON A.ID= B.ID 
+0

«И основная проблема, я беспокойся производительность будет медленным» Хватит гадать начать профилирование. Все остальное - пустая трата времени. – PeeHaa

+0

Возможный дубликат [Получение последней записи в каждой группе] (http://stackoverflow.com/questions/1313120/retrieving-the-last-record-in-each-group) –

+0

Я также рекомендовал бы сохранить один столбец Date вместо года и месяца в разных колонках. –

ответ

2

Использование оконных функций следует сделать трюк - это дает каждому записать строку, основанную на дату убывания, и группы по ProductCode

SELECT 
purchaseID 
,ProductCode 
,Qty 
,Pdate 
FROM 
( 
SELECT 
purchaseID 
,Qty 
,ProductCode 
,CAST(PYear AS VARCHAR(4)) + '-' + CAST(PMonthAS VARCHAR(2)) + '-1') AS PDate 
,ROW_NUMBER() OVER (PARTITION BY ProductCode ORDER BY CAST(PYear AS VARCHAR(4)) + '-' + CAST(PMonthAS VARCHAR(2)) + '-1') DESC) AS ROWNO 
FROM Table1 
) 
WHERE ROWNO = 1 
2

Вы можете использовать ROW_NUMBER с КТР? Вам не нужно использовать JOIN в этом случае:

;WITH CTE AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY PRODUCTCODE ORDER BY PYEAR DESC, PMONTH DESC) AS RN 
    FROM TABLE1) 
SELECT PRODUCTCODE, QTY, PYEAR, PMONTH 
FROM CTE 
WHERE RN = 1 

Вот SQL Скрипки: http://sqlfiddle.com/#!6/90fe1/1

Смежные вопросы