Multi Join Select - PullRequest
       15

Multi Join Select

0 голосов
/ 02 апреля 2019

Возьмем таблицу с названием Товары и столбцы: Товар, Продавец, Цена, Дата.Теперь мне нужен такой селектор: для любого товара нам нужно выбрать минимальную цену в некотором интервале дат, которая была предложена продавцом, если есть более 1 даты, дают только позже) и если на эту дату более 1 продавца, покажитевсе.Я написал некоторый код, но он не берет минимальную дату из данного списка.Что мне нужно добавить в селектор, чтобы получить нужный мне результат?

SELECT *    
FROM Items mt 
    INNER JOIN
    (
        SELECT Item, MIN(Price) MinPrice
        FROM Items    
        GROUP BY Item
    ) 
    t ON mt.Item = t.Item AND mt.Price = t.MinPrice
    where Date > '2019-04-01' and Date < '2019-04-15'
    sample: 
    ItemA SellerA 10 2019-04-02
    ItemA SellerB 10 2019-04-03
    ItemA SellerC 10 2019-04-07
    ItemA SellerD 20 2019-04-05
    ItemA SellerE 10 2019-04-06
    ItemA SellerF 10 2019-04-02
    ItemA SellerG 20 2019-04-07

    result:
    ItemA SellerC 10 2019-04-07
    ItemA SellerG 20 2019-04-07

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

Таким образом, мы не можем присоединиться к дате, поскольку группировка по ней может не дать нам минимальную цену в пределах диапазона дат. Поэтому мы должны использовать два предложения where.

Таким образом, мы используем внутренний запрос Z, чтобы получить минимальную цену и максимальную дату на единицу в пределах требуемого диапазона дат. Затем присоединитесь к своему базовому набору, чтобы получить всех продавцов с этой максимальной датой.

Непроверенные:

SELECT I.Item, I.Seller, I.Price,I.Date
FROM ITEMS I
INNER JOIN (SELECT min(price) MinPrice, max(date) maxDate, item
            FROM items 
            WHERE Date > '2019-04-01' and < '2018-04-15'
            GROUP BY Item) Z
  ON I.Item = Z.Item
 AND I.Price =  Z.Price
 and I.Date = Z.MaxDate
WHERE I.Date > '2019-04-01' and < '2018-04-15'

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

Итак ...

SELECT I.Item, I.Seller, I.Price,I.Date
FROM ITEMS I
INNER JOIN (SELECT min(price) MinPrice, item
            FROM items 
            WHERE Date > '2019-04-01' and < '2018-04-15'
            GROUP BY Item) Z
  ON I.Item = Z.Item
 AND I.Price =  Z.Price
 INNER JOIN (SELECT max(Date) MaxDate, item, Price
            FROM items 
            WHERE Date > '2019-04-01' and < '2018-04-15'
            GROUP BY Item, Price) Y
  ON I.Item = Y.Item
 AND I.Price =  Y.Price
 AND I.Date = Y.MaxDate
WHERE I.Date > '2019-04-01' and < '2018-04-15'

Но тогда я думаю, что должен быть способ упростить это, так что мне не нужно иметь 3 предложения where ...

0 голосов
/ 02 апреля 2019

Я думаю, что вы хотите:

SELECT it.*    
FROM Items it INNER JOIN
     (SELECT Item, MIN(Price) as MinPrice
      FROM Items  
      WHERE Date > '2019-04-01' AND Date < '2019-04-15'  
      GROUP BY Item
     ) itmin
     ON it.Item = itmin.Item AND it.Price = itmin.MinPrice
WHERE it.Date > '2019-04-01' AND it.Date < '2019-04-15' ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...