2014-09-17 5 views
0

Так что у меня есть эта проблема. Скажем, я уже сгруппировал переменную, я пытаюсь выбрать первую группу из повторяющихся групп.SQL-группирование переменных и выбор последней строки первой группы повторяющейся группы

Table1

ProductID Name        Dates 
----------- ---------------------------------- ---------- 
491   Paint - Silver      1999/08/1   
491   Paint - Silver      1999/12/23   
491   Paint - Blue      2000/1/1   
491   Paint - Silver      2001/1/1  
491   Paint - Red      2001/1/21   
491   Paint - Red      2001/1/25   
491   Paint - Silver      2002/3/4   
491   Paint - Blue      2003/4/14   
491   Paint - Blue      2003/4/15   
491   Paint - Blue      2004/3/26   
491   Paint - Red      2005/2/1   
491   Paint - Red      2005/5/1   
491   Paint - Yellow      2006/7/2   
491   Paint - Yellow      2009/1/1   
491   Paint - Black      2010/1/1   
491   Paint - Black      2011/1/3 

Проблема заключается в том, я хочу, чтобы выбрать Paint - Серебро, когда до его смены краски - синий, следовательно, дата будет 1999/12/23 для краски - серебро. В двух словах я хочу получить последнюю дату первого продукта, прежде чем он будет изменен на другой продукт для productID = 491. Это просто для одного идентификатора продукта (I.e 491). Я хочу сделать это для нескольких идентификаторов продуктов, которые имеют одинаковый формат. Ничто не работает, и любая помощь вообще будет оценена

+0

Что вы пытаетесь до сих пор? –

ответ

1

Это запрос, в котором следует указать изменение названия продукта.

SELECT a.name, b.name, a.dates, b.dates , (a.row - b.row) as row_diff 
FROM 
(SELECT *, @rowa := @rowa + 1 AS row FROM product 
     CROSS JOIN (SELECT @rowa := 0) AS r) a 
LEFT JOIN 
(SELECT *, @rowb := @rowb + 1 AS row FROM product 
     CROSS JOIN (SELECT @rowb := 0) AS r) b 
ON a.dates < b.dates 
WHERE a.name != b.name AND (a.row - b.row) = -1; 

Это даст следующий результирующий:

+--------------+--------------+------------+------------+----------+ 
| name   | name   | dates  | dates  | row_diff | 
+--------------+--------------+------------+------------+----------+ 
| Paint-Silver | Paint-Blue | 1999-12-23 | 2000-01-01 |  -1 | 
| Paint-Blue | Paint-Silver | 2000-01-01 | 2001-01-01 |  -1 | 
| Paint-Silver | Paint-Red | 2001-01-01 | 2001-01-21 |  -1 | 
| Paint-Red | Paint-Silver | 2001-01-25 | 2002-03-04 |  -1 | 
| Paint-Silver | Paint-Blue | 2002-03-04 | 2003-04-14 |  -1 | 
| Paint-Blue | Paint-Red | 2004-03-26 | 2005-02-01 |  -1 | 
| Paint-Red | Paint-Yellow | 2005-05-01 | 2006-07-02 |  -1 | 
| Paint-Yellow | Paint-Black | 2009-01-01 | 2010-01-01 |  -1 | 
+--------------+--------------+------------+------------+----------+ 
+0

Я потратил довольно много времени на поиск этого запроса. Поэтому, пожалуйста, примите ответ как правильный, если он решает вашу цель. – Subodh

0

Я не разбираюсь в sql, но не мог бы вы прокрутить список имен, сравнивая каждую строку с приведенной ниже и ищет изменение на другое имя (или указанное имя, например, краска синяя), а затем выбрать текущую строку, если разница найдена?