Я сделал запрос, который использует 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
4304 был разбит на TAXITEMGROUPID
, когда STARTDATE
также совпадает. Когда STARTDATE
отличается, я хочу, чтобы он был разбит только на PROJID
и ITEMID
. Таким образом, RN не должен быть 1 в последнем случае, где AMOUNT
= 8400.
Это запрос, который я сейчас использую:
;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,ApprovedBudget_Sales.STARTDATE) AS [VARCHAR](2)),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.TAXITEMGROUPID
,FORECASTSALES.SALESQTY
,FORECASTSALES.PROJID
,FORECASTSALES.ITEMID
,FORECASTSALES.ACTIVE
,CATEGORYTABLE.CATEGORYNAME
,ApprovedBudget_Sales.RN
,ApprovedBudget_Sales.STARTDATE
ORDER BY FORECASTSALES.PROJID, FORECASTSALES.ITEMID
Есть предложения?
С уважением, Игорь