Sql server 基于条件的语句划分

Sql server 基于条件的语句划分,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我做了一个查询,使用RowNumber()对某个表进行分区,然后我只选择行,其中RN=1。然而,我现在看到我当前的查询是不够的,因为分区必须是动态的,基于一个条件 我的查询结果如下表所示,但不应包括某些记录: PROJID ITEMID AMOUNT STARTDATE TAXITEMGROUPID MODELID RN 300.201343.01 4101 9648168.000000000000 201710

我做了一个查询,使用
RowNumber()
对某个表进行
分区
,然后我只选择行
,其中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
例如,当
STARTDATE
也相同时,我只希望
ITEMID
4304被
TAXITEMGROUPID
分区。当
STARTDATE
不同时,我只希望它按
PROJID
ITEMID
进行分区。 因此,在后一种情况下,RN不应为1,即
金额
=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
有什么建议吗

亲切问候,,
Igor

我们可以利用样本数据、预期结果以及您当前获得的结果。例如,很难说出你在找什么,因为你的叙述讨论了4303——这根本不在你给我们展示的结果中。对不起,一个打字错误,那一定是4304。我编辑了这篇文章。所以你希望在同一日期发生冲突的项目的行数始终为1?是的,只要它们具有类似的项目ID、项目ID、TAXITEMGROUPID、STARTDATE,然后是分区项目ID、项目ID、TAXITEMGROUPID。如果它们只有一个相似的PROJID、ITEMID、TAXITEMGROUPID,但起始日期不同,那么就划分PROJID、ITEMID。为什么不使用两个ROW_NUMBER()函数呢?