Выберите только один продукт с MAX (Id) для каждой даты - PullRequest
0 голосов
/ 04 января 2019

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

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

По сути, это мой набор данных: список фолио (клиент), по дате, идентификатору для каждого фолио и дате, и если фолио изменяется, предыдущий сохраняется, но для того же фолио добавляются новые строки, а идентификатор увеличивается.

Date       | Client | ProductCode | ID |  Price
-----------|--------|-------------|----|--------
2019-01-01 |   C1   |      A      | 1  |  100
2019-01-02 |   C1   |      A      | 2  |  100
2019-01-03 |   C1   |      B      | 3  |  100
2019-01-01 |   C1   |      A      | 4  |  150
2019-01-02 |   C1   |      A      | 5  |  150
2019-01-03 |   C1   |      B      | 6  |  150
2019-01-02 |   C2   |      B      | 1  |  150
2019-01-02 |   C2   |      X      | 2  |  150

Требуемый вывод: для одной данной даты, если у меня есть дважды одно и то же фолио, я хочу только самый последний (самый высокий идентификатор) с соответствующей ценой (и, возможно, некоторыми дополнительными столбцами)

Date       | Client | ProductCode | ID |  Price
-----------|--------|-------------|----|--------
2019-01-01 |   C1   |      A      | 4  |  150
2019-01-02 |   C1   |      A      | 5  |  150
2019-01-03 |   C1   |      B      | 6  |  150
2019-01-02 |   C2   |      X      | 2  |  150

Я пытался перейти с:

SELECT Date, Client, ProductCode , Price, MAX(ID)
From myTable
Group BY Date, Client, ProductCode , Price

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

Затем я попытался перейти с ROW_NUMBER() over(partition by Client ORDER BY ID) и затем выбрать MAX, но я просто создаю новый идентификатор и возвращаюсь на круги своя.

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

Спасибо

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Используйте where, чтобы выбрать нужные строки. Один метод использует коррелированный подзапрос:

select t.*
from myTable t
where t.id = (select max(t2.id)
              from mytable t2
              where t2.date = t.date and t2.client = t.client
             );

С индексом (client, date, id) это должно иметь очень хорошую производительность.

0 голосов
/ 04 января 2019

Есть много способов сделать то же самое, один из них - использовать функцию row_number

WITH C AS(
SELECT Date
     , Client
     , ProductCode 
     , Price
     , ROW_NUMBER() OVER(PARTITION DATE, FOLIO, PRODUCTCODE ORDER BY ID DESC) AS RN 
From myTable
)
SELECT Date
     , Client
     , ProductCode 
     , Price
FROM C 
WHERE RN = 1 

В этом случае вам нужно создать CTE (это работает как подзапрос, но более читабельный), затем применить row_number и разделить ваши строки по дате, фолио, коду продукта и упорядочить его по id, это вернет вас ваш текущий список с rn, а затем с фильтром rn, в этом есть что-то хорошее: rn для каждого случая не повторяется.

...