按客户分组和最大日期

时间:2012-07-16 12:19:45

标签: 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 ) )
       AND ( CARHARCARKOD NOT LIKE 'W%' )
       AND ( CARHARCARKOD NOT LIKE 'Z%' )
       AND ( CARHARGCFLAG = 2 )
       AND ( CARHARIADEFLAG = 0 )
ORDER  BY CARHARTAR DESC 

此查询按日期降序列出所有付款顺序。但我只需要最后一笔付款。我正在使用carharcarkod组,但我有一个聚合函数问题。我该怎么办?

Here is a screenshot of query result

3 个答案:

答案 0 :(得分:1)

我认为ROW_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 

答案 1 :(得分:0)

如果您使用group by子句,则必须包括要选择的组中的所有字段。

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 

答案 2 :(得分:0)

with cte as(
SELECT CARHARCARKOD,max(CARHARTAR) [CARHARTAR]
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 CARHARCARKOD    )   
select C.CARHARTAR,
       C.CARHARREFNO,
       C.CARHARCARKOD,
       C.CARHARCARUNVAN,
       C.CARHARACIKLAMA,
       C.CARHARTUTAR
FROM  cte join CARHAR C
on  CTE.CARHARCARKOD =C.CARHARCARKOD     
and cte.CARHARTAR= C.CARHARTAR
相关问题