TSQL Row_Number

时间:2016-10-05 04:57:23

标签: sql sql-server-2008 window-functions

这个问题在我之前已经被类似地讨论了。但是我正在努力。

我需要根据客户购买模式找到前N名的销售额。

理想情况下,这需要按客户按月按年度排名前N,但现在我只是在整个数据库中查看前N个。

我的查询如下:

-- QUERY TO SHOW TOP 2 CUSTOMER INVOICES BY CUSTOMER BY MONTH

SELECT
    bill_to_code,
    INVOICE_NUMBER,
    SUM( INVOICE_AMOUNT_CORP ) AS 'SALES',
    ROW_NUMBER() OVER ( PARTITION BY bill_to_code ORDER BY SUM( INVOICE_AMOUNT_CORP ) DESC ) AS 'Row'
FROM
    FACT_OM_INVOICE
    JOIN dim_customer_bill_to ON FACT_OM_INVOICE.dim_customer_bill_to_key = dim_customer_bill_to.dim_customer_bill_to_key
--WHERE
--    'ROW' < 2
GROUP BY
    invoice_number,
    Dim_customer_bill_to.bill_to_code

我无法理解将Row限制为=&lt;的解决方案。 Ñ

请帮忙。

2 个答案:

答案 0 :(得分:1)

试试这个。

-- QUERY TO SHOW TOP 2 CUSTOMER INVOICES BY CUSTOMER BY MONTH
;WITH Top2Customers
AS
(
SELECT
    bill_to_code,
    INVOICE_NUMBER,
    SUM( INVOICE_AMOUNT_CORP ) AS 'SALES',
    ROW_NUMBER() OVER ( PARTITION BY bill_to_code ORDER BY SUM( INVOICE_AMOUNT_CORP ) DESC ) 
    AS 'RowNumber'
FROM
    FACT_OM_INVOICE
    JOIN dim_customer_bill_to ON FACT_OM_INVOICE.dim_customer_bill_to_key = dim_customer_bill_to.dim_customer_bill_to_key
GROUP BY
    invoice_number,
    Dim_customer_bill_to.bill_to_code
)
SELECT * FROM Top2Customers WHERE RowNumber < 3

答案 1 :(得分:0)

您必须将select包装到另一个中以使用row_number()

生成的值
select * from (
SELECT
    bill_to_code,
    INVOICE_NUMBER,
    SUM( INVOICE_AMOUNT_CORP ) AS SALES,
    ROW_NUMBER() OVER ( PARTITION BY bill_to_code ORDER BY SUM( INVOICE_AMOUNT_CORP ) DESC ) AS RowNo
FROM
    FACT_OM_INVOICE
    JOIN dim_customer_bill_to ON FACT_OM_INVOICE.dim_customer_bill_to_key = dim_customer_bill_to.dim_customer_bill_to_key
--WHERE
--    'ROW' < 2
GROUP BY
    invoice_number,
    Dim_customer_bill_to.bill_to_code
) base where RowNo < 2