SQL Server 2008,限制row_number()(由...分隔)

时间:2016-12-14 04:59:06

标签: sql sql-server-2008

我有一个看起来像这样的数据库表

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 =。

另一个问题是我想显示最近的三笔交易。 我知道一种方法是为每个事务添加行号,但我的数据库包含来自90年代后期的数据。它太大了。

所以,我想限制最近3次交易的搜索,而不进行外部查询。

我的想法是,我没有那么多客户类型,所以也许我可以追溯每个客户类型的3个以上交易,我相信这些交易要轻得多。

谢谢!

2 个答案:

答案 0 :(得分:1)

  1. row_number替换为dense_rank

    select  customertype,
            dense_rank() over (partition by customertype 
                               order by transactiondate desc) as 'rowNum'
    from  myDB
    
  2. 您可以假设您在过去30天内至少有过3次交易吗? 使用WHERE选择过去30天内的交易,然后使用row_number降序查找最近3笔交易。

答案 1 :(得分: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;

未经测试;)。