TSQL Join на столбцах с разными значениями - PullRequest
1 голос
/ 10 февраля 2012

У меня есть таблица с ценами на товары, которые меняются ежедневно, скажем,

цена (productID int, float, dateprice datetime).

Эти цены не существуют в выходные дни,поэтому в таблице указаны не все дневные цены.

Я хотел бы получить результат с productId, day, todayPrice, вчераPrice (очевидно, первая дата не будет отображаться в этом результате, так как у нее нет предыдущего дня)).Я думал, что такое объединение даст мне то, что я хочу, но не сработало.

select p1.productId, p1.dateprice, p1.price, p2.price
from price p1
inner join price pr ON pr.productId = p1.productId
inner join price p2 ON p1.dateprice = (select max (p.dateprice)
                                       from price p
                                       where p.dateprice < p1.dateprice)

Этот выбор возвращает пустой результат, но если я использую "=" вместо "<", он возвращает мнетаблица с множеством одинаковых строк (как и ожидалось). </p>

Как вы предлагаете мне выбрать эту информацию?

Ответы [ 2 ]

1 голос
/ 10 февраля 2012

Вы находитесь на правильном пути, просто измените ваше условие соединения, например:

select p1.productId, p1.dateprice, p1.price, p2.price
from price p1
inner join price p2 ON p1.productId = p2.productId AND p1.dateprice = DATEADD(day, -1, p2.dateprice) AND p2.dateprice = CONVERT(VARCHAR, GETDATE())

CONVERT на GETDATE() используется для усечения даты и времени, при условии, что ваша dateprice уже урезала datetimeто есть со временем в 12:00.Если нет, вам нужно использовать CONVERT для этого.Если вы хотите использовать MAX () вместо этого, чтобы получить последний, лучше использовать CROSS APPLY:

select p1.productId, p1.dateprice, p1.price, p2.price
    from price p1
    CROSS APPLY (select TOP 1 p.price
FROM price p WHERE p.productId = p1.productId ORDER BY p.dateprice DESC) p2
1 голос
/ 10 февраля 2012

Вы были близки ... но если вы объединяете цену одного продукта с предыдущей ценой, вам нужно убедиться, что вы включаете идентификатор продукта, в противном случае вы просто присоединитесь к цене любого другого продукта .

Кроме того, если p2 - цена предыдущего дня ... это дата, которую вы бы проверили, чтобы найти max (p.dateprice), который меньше p1.dateprice.

select 
    p1.productId, p1.dateprice, 
    p1.price as todayPrice, p2.price as yesterdayPrice
from price p1
inner join price p2 
    on p1.productId = p2.productId
    and p2.dateprice = (
        select max (p.dateprice)
        from price p
        where 
            p.dateprice < p1.dateprice
            and p.productId = p1.productId
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...