2016-12-14 2 views
1

У меня есть таблица базы данных, которая выглядит следующим образомSQL Server 2008, ограничить row_number() над (partiton по)

customer type || transaction date || amount 
      a || June 27 2016 || $10 

Я хотел бы добавить заказ номер строки по дате сделки секционированной по типу клиента ,

select 
    customertype, 
    row_number() over(partition by customertype order by transactiondate desc) as 'rowNum' 
from 
    myDB 

Одна из проблем, с запросом, что я получаю это:

customer type || transaction date || amount || rowNum 
      A ||  Jan 1 2016 || $20 || 1 
      A ||  Jan 1 2016 || $40 || 2 

Проблема заключается в том, я не хочу, чтобы назначить различные rowNum для различных количеств. Обе строки должны иметь rowNum = 1 независимо от суммы.

Еще одна проблема заключается в том, что я хотел бы показать последние три транзакции. Я знаю один способ добавить номер строки для каждой транзакции, но мой db содержит данные с 1990-х годов. Он слишком большой.

Итак, я хочу ограничить поиск самыми последними 3 транзакциями без внешнего запроса.

Моя идея состоит в том, что у меня нет такого количества клиентов, поэтому, возможно, я смогу отслеживать 3 прошлых транзакции для каждого типа customertype, который, я считаю, намного легче.

Спасибо!

ответ

1
  1. заменить row_number с dense_rank

    select customertype, 
         dense_rank() over (partition by customertype 
              order by transactiondate desc) as 'rowNum' 
    from myDB 
    
  2. Вы, вероятно, можно предположить, что вы, по крайней мере, 3 сделки, скажем, в течение последних 30 дней?
    Используйте WHERE, чтобы выбрать транзакцию за последние 30 дней, а затем используйте row_number с убывающим порядком, чтобы найти последние 3 транзакции.

+0

для 2, нет, я не могу предположить, что последние 3 транзакции были сделаны за последние 30 дней. Это может быть почти 5 лет назад. Я действительно не могу использовать временной интервал в sql. – Nayana

+0

Таким образом, нет никакой вероятности, что ваша база данных слишком велика, чтобы запросить полную историю. –

0

Я думаю, что вам нужен запрос, как это:

SELECT myDB.*, t.rn 
FROM myDB 
LEFT JOIN 
    (SELECT 
     customertype, transactiondate, 
     ROW_NUMBER() OVER (ORDER BY customertype, transactiondate) rn 
    FROM myDB 
    GROUP BY 
     customertype, transactiondate) t 
ON myDB.customertype = t.customertype AND myDB.transactiondate = t.transactiondate; 

Не проверено;).

Смежные вопросы