我进行了一个查询,该查询使用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
相同时,我只希望TAXITEMGROUPID
被STARTDATE
分区。当STARTDATE
不同时,我只希望它被PROJID
和ITEMID
分区。
因此,在后一种情况下,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)