2014-01-02 2 views
0

Я ищу, чтобы сделать вывод SQL с самой обновленной ценой продукта. Product_price может быть обновлен несколько раз для номера продукта, поэтому создается несколько строк. Я пытаюсь устранить несколько строк на номер продукта.Попытка устранить повторяющиеся строки SQL-запрос

SELECT 
product_number 
,product_price 
,MAX(update_timestamp) 
FROM product_price 
ORDER BY 1,2 
+0

вы можете разработать проблему немного больше? – user1336827

+0

Я ищу, чтобы устранить более одной строки на product_number – Bachzen

+2

Если бы я был вашей СУБД, как бы вы мне звонили? Поцарапайте, что вы делаете агрегат без группы, на мой mySQL. – Zane

ответ

1

Есть несколько способов сделать это. Мой предпочтительный подзапрос. Сначала получите номер продукта и его maxtimestamp:

SELECT product_number 
,MAX(update_timestamp) as maxtimestamp 
FROM product_price 
group by product_number 

Теперь превратить это в подзапрос и внутреннее соединение его к первому столу, чтобы отфильтровать все, кроме макс:

select a.product_number, a.maxtimestamp, b.product_price 
from (SELECT product_number ,MAX(update_timestamp) as maxtimestamp 
FROM product_price 
group by product_number) a 
inner join product_price b on a.product_number = b.product_number 
    and a.maxtimestamp = b.update_timestamp 
+0

есть некоторые результаты, где временная метка дублируется. Есть ли простой способ выбрать только одну запись? – Bachzen

0

Если вы просто хотите, чтобы самые последние попробуйте наклеивания пункт TOP 1 в него и удалить MAX: SELECT TOP 1 product_number , PRODUCT_PRICE , update_timestamp ОТ PRODUCT_PRICE ORDER BY 1,2

+0

Top 1 дает мне ошибку – Bachzen

+0

Какую базу данных вы используете (например, SQL Server, MySql)? Какая у вас ошибка? – twrowsell

0

Если предположить, что вы хотите, последний обновлена ​​цена для каждого продукта, попробуйте следующее:

SELECT 
    Ranked.product_number, 
    Ranked.product_price, 
    Ranked.update_timestamp 
FROM 
(
    SELECT 
    pp.product_number, 
    pp.product_price, 
    pp.update_timestamp, 
    DENSE_RANK() OVER (
     PARTITION BY pp.product_number 
     ORDER BY pp.update_timestamp DESC 
    ) AS TimeRank 
    FROM product_price AS pp 
) AS Ranked 
WHERE Ranked.TimeRank = 1 

это плотный ранг в центре говорит, что в пределах каждого продукта (PARTITION BY), ранжируйте последние обновления (update_timestamp DESC). Затем во внешнем запросе мы принимаем только # 1 (TimeRank = 1).

0

попробовать это

SELECT 
    product_number 
    ,product_price 
    ,update_timestamp 
FROM product_price 
ORDER BY update_timestamp DESC LIMIT 1 

вы заказ по update_timestamp, а затем взять первый результат.

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

SELECT 
p.* 
FROM 
    product_price p 
INNER JOIN 
    (SELECT 
      product_number, MAX(update_timestamp) AS latest 
     FROM 
      product_price 
     GROUP BY 
      product_number 
    ) AS groupedp 
    ON groupedp.product_number = p.product_number 
    AND groupedp.latest = p.update_timestamp ; 
Смежные вопросы