PARTITION BY条件声明

我进行了一个查询,该查询使用RowNumber()PARTITION某个表,此后我仅选择行WHERE RN = 1。但是,我现在看到我当前的查询不足,因为根据条件分区必须是动态的。

我的查询结果显示在下表中,但是,不应包含某些记录:

PROJID          ITEMID  AMOUNT                  STARTDATE   TAXITEMGROUPID  MODELID     RN
300.201343.01   4101    9648168.000000000000    20171004    Hoog            Budget      1
300.201343.01   4102    0.000000000000          20171004    Hoog            Budget      1
300.201343.01   4201    204541.000000000000     20171004    Hoog            Budget      1
300.201343.01   4202    195750.000000000000     20171004    Hoog            Budget_21   1
300.201343.01   4205    52933.460000000000      20171004    Hoog            Budget      1
300.201343.01   4211    278400.000000000000     20171004    Hoog            Budget_21   1
300.201343.01   4212    34800.000000000000      20171004    Hoog            Budget      1
300.201343.01   4215    620448.000000000000     20171004    Hoog            Budget_21   1
300.201343.01   4304    8400.000000000000       20151030    Geen            Budget_12   1 --shouldn't have RN = 1
300.201343.01   4304    8700.000000000000       20171004    Hoog            Budget      1
300.201343.01   4305    8700.000000000000       20171004    Hoog            Budget      1
300.201343.01   4307    130500.000000000000     20171004    Geen            Budget      1
300.201343.01   4307    154728.000000000000     20151030    Laag            Budget_12   1 --shouldn't have RN = 1
300.201343.01   4309    41322.310000000000      20150216    Hoog            Budget_5    1

例如,当ITEMID相同时,我只希望TAXITEMGROUPIDSTARTDATE分区。当STARTDATE不同时,我只希望它被PROJIDITEMID分区。 因此,在后一种情况下,AMOUNT = 8400时,RN不应为1。

这是我当前使用的查询:

;WITH ApprovedBudget_Sales AS
(
    SELECT *,ROW_NUMber() OVER (PARTITION BY PROJID,ITEMID,TAXITEMGROUPID ORDER BY STARTDATE DESC) RN
    FROM FORECASTSALES
    WHERE APPROVED = 1 --AND PROJID = '300.201343.01'
)
SELECT
    FORECASTSALES.PROJID,FORECASTSALES.ITEMID,FORECASTSALES.SALESQTY AS AMOUNT,CAST(DATEPART(YYYY,ApprovedBudget_Sales.STARTDATE) AS [CHAR](4))
       + RIGHT('0' + CAST(DATEPART(M,ApprovedBudget_Sales.STARTDATE) AS [VARCHAR](2)),2)  
       + RIGHT('0' + CAST(DATEPART(D,2) AS STARTDATE,FORECASTSALES.TAXITEMGROUPID,MAX(FORECASTSALES.MODELID) AS MODELID,RN
FROM FORECASTSALES
INNER JOIN ApprovedBudget_Sales
    ON ApprovedBudget_Sales.RECID = FORECASTSALES.RECID
    AND ApprovedBudget_Sales.DATAAREAID = FORECASTSALES.DATAAREAID
LEFT JOIN CATEGORYTABLE
    ON CATEGORYTABLE.CATEGORYID = FORECASTSALES.ITEMID
    AND CATEGORYTABLE.DATAAREAID = FORECASTSALES.DATAAREAID
WHERE ApprovedBudget_Sales.RN = 1 --AND FORECASTSALES.PROJID = '300.201343.01'
GROUP BY
    FORECASTSALES.DATAAREAID,FORECASTSALES.SALESQTY,FORECASTSALES.PROJID,FORECASTSALES.actIVE,CATEGORYTABLE.CATEGORYNAME,ApprovedBudget_Sales.RN,ApprovedBudget_Sales.STARTDATE
ORDER BY FORECASTSALES.PROJID,FORECASTSALES.ITEMID

有什么建议吗?

亲切的问候, 伊戈尔(Igor)

zuoduzu 回答:PARTITION BY条件声明

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3159063.html

大家都在问