Sql 按客户和最长日期分组

Sql 按客户和最长日期分组,sql,sql-server-2005,group-by,max,greatest-n-per-group,Sql,Sql Server 2005,Group By,Max,Greatest N Per Group,我想按日期降序列出客户订单的最后付款 我编写了一个sql查询 SELECT CARHARTAR, CARHARREFNO, CARHARCARKOD, CARHARCARUNVAN, CARHARACIKLAMA, CARHARTUTAR FROM CARHAR WHERE ( CARHARTIPI IN ( 2, 4 ) ) AND ( CARHARISTIPNO IN ( 2, 6 ) )

我想按日期降序列出客户订单的最后付款

我编写了一个sql查询

 SELECT CARHARTAR,
       CARHARREFNO,
       CARHARCARKOD,
       CARHARCARUNVAN,
       CARHARACIKLAMA,
       CARHARTUTAR
FROM   CARHAR
WHERE  ( CARHARTIPI IN ( 2, 4 ) )
       AND ( CARHARISTIPNO IN ( 2, 6 ) )
       AND ( CARHARCARKOD NOT LIKE 'W%' )
       AND ( CARHARCARKOD NOT LIKE 'Z%' )
       AND ( CARHARGCFLAG = 2 )
       AND ( CARHARIADEFLAG = 0 )
ORDER  BY CARHARTAR DESC 
此查询按日期降序列出所有付款顺序。但我只需要最后一次付款。我正在使用由Carkod创建的组,但我有一个aggreate函数问题。我该怎么办


如果使用group by子句,则必须在group中包含所有要选择的字段

SELECT CARHARTAR,
   CARHARCARKOD FROM   CARHAR WHERE  ( CARHARTIPI IN ( 2, 4 ) )
   AND ( CARHARISTIPNO IN ( 2, 6 ) )
   AND ( CARHARCARKOD NOT LIKE 'W%' )
   AND ( CARHARCARKOD NOT LIKE 'Z%' )
   AND ( CARHARGCFLAG = 2 )
   AND ( CARHARIADEFLAG = 0 ) GROUP BY CARHARTAR,carharcarkod DESC 

若使用GROUPBY子句,那个么必须在group中包含所有要选择的字段

SELECT CARHARTAR,
   CARHARCARKOD FROM   CARHAR WHERE  ( CARHARTIPI IN ( 2, 4 ) )
   AND ( CARHARISTIPNO IN ( 2, 6 ) )
   AND ( CARHARCARKOD NOT LIKE 'W%' )
   AND ( CARHARCARKOD NOT LIKE 'Z%' )
   AND ( CARHARGCFLAG = 2 )
   AND ( CARHARIADEFLAG = 0 ) GROUP BY CARHARTAR,carharcarkod DESC 

我认为
ROW\u NUMBER
功能可以实现您所追求的:

;WITH Payments AS
(   SELECT  CARHARTAR,
            CARHARREFNO,
            CARHARCARKOD,
            CARHARCARUNVAN,
            CARHARACIKLAMA,
            CARHARTUTAR,
            ROW_NUMBER() OVER(PARTITION BY CARHARCARKOD ORDER BY CARHARTAR DESC) [RowNumber]
    FROM    CARHAR
    WHERE   CARHARTIPI IN (2, 4)
    AND     CARHARISTIPNO IN (2, 6)
    AND     CARHARCARKOD NOT LIKE 'W%'
    AND     CARHARCARKOD NOT LIKE 'Z%'
    AND     CARHARGCFLAG = 2
    AND     CARHARIADEFLAG = 0
)
SELECT  CARHARTAR,
        CARHARREFNO,
        CARHARCARKOD,
        CARHARCARUNVAN,
        CARHARACIKLAMA,
        CARHARTUTAR
FROM    Payments
WHERE   RowNumber = 1
ORDER BY CARHARTAR 

我认为
ROW\u NUMBER
功能可以实现您所追求的:

;WITH Payments AS
(   SELECT  CARHARTAR,
            CARHARREFNO,
            CARHARCARKOD,
            CARHARCARUNVAN,
            CARHARACIKLAMA,
            CARHARTUTAR,
            ROW_NUMBER() OVER(PARTITION BY CARHARCARKOD ORDER BY CARHARTAR DESC) [RowNumber]
    FROM    CARHAR
    WHERE   CARHARTIPI IN (2, 4)
    AND     CARHARISTIPNO IN (2, 6)
    AND     CARHARCARKOD NOT LIKE 'W%'
    AND     CARHARCARKOD NOT LIKE 'Z%'
    AND     CARHARGCFLAG = 2
    AND     CARHARIADEFLAG = 0
)
SELECT  CARHARTAR,
        CARHARREFNO,
        CARHARCARKOD,
        CARHARCARUNVAN,
        CARHARACIKLAMA,
        CARHARTUTAR
FROM    Payments
WHERE   RowNumber = 1
ORDER BY CARHARTAR 

谢谢你的帮助。但查询结果不正确。你可以在这里看到:我只需要客户最后的付款谢谢你的帮助。但查询结果不正确。你可以在这里看到:我只需要客户的最后一次付款,我知道集团的使用情况。但我需要所有字段(CARHARTAR、CARHARREFNO、CARHARCARKOD、CARHARCARUNVAN、Carharacilama、CARHARTUTAR),我不知道我应该做什么,我知道按用法分组。但是我需要所有字段(CARHARTAR、CARHARREFNO、CARHARCARKOD、CARHARCARUNVAN、CARHARACIKLAMA、CARHARTUTAR),我不知道应该使用什么样的Sql Server版本?哪些列构成主键?如果客户在同一天支付了两次,您希望显示哪些付款?我使用的是sql server 2005。表中没有主键。我们是一家批发公司,这就是为什么我们的客户不在一天内支付两次。如果存在一天内支付两次的付款,我可以将其相加。您使用的是哪个版本的Sql Server?哪些列构成主键?如果客户在同一天支付了两次,您希望显示哪些付款?我使用的是sql server 2005。表中没有主键。我们是一家批发公司,这就是为什么我们的客户不在一天内支付两次。如果存在一天内支付两次的付款,我可以合计。