如何编写一个会留下1行的查询

时间:2014-01-06 20:40:21

标签: sql sql-server-2008-r2

我有一组看起来像这样的数据我想为每个有一个p类型的debnrs删除一行。我不在乎哪一个。除日期外,类型中P的两行相同。如何在类型中选择只有一个P的那个。

debnr           docno      date            type  num       amount

 4          NULL    2013-08-29 07:26:25.000 P   1761        -12
 4          NULL    2013-09-12 00:00:00.000 P   1761        -12
 4          168371  2013-08-29 00:00:00.000 I     168371    12
 5          NULL    2013-10-11 09:24:58.000 P   7287        -24
 5          NULL    2013-10-14 00:00:00.000 P   7287        -24
 5          170366  2013-10-11 00:00:00.000 I     170366    24
 6          NULL    2013-10-24 00:00:00.000 P   4023        -465
 6          NULL    2013-10-24 09:42:18.000 P   4023        -465
 6          171095  2013-10-24 00:00:00.000 I     171095    465
 7          NULL    2013-12-16 00:00:00.000 P     171502    -394.2
 7          NULL    2013-12-16 00:00:00.000 P   6601        -394.2
 7          171502  2013-10-30 00:00:00.000 I     171502    394.2

我怎么能让它看起来像这样。

 4          NULL    2013-09-12 00:00:00.000 P   1761        -12
 4          168371  2013-08-29 00:00:00.000 I     168371    12
 5          NULL    2013-10-14 00:00:00.000 P   7287        -24
 5          170366  2013-10-11 00:00:00.000 I     170366    24
 6          NULL    2013-10-24 09:42:18.000 P   4023        -465
 6          171095  2013-10-24 00:00:00.000 I     171095    465
 7          NULL    2013-12-16 00:00:00.000 P   6601        -394.2
 7          171502  2013-10-30 00:00:00.000 I     171502    394.2

3 个答案:

答案 0 :(得分:1)

在黑暗中拍摄:

select 
  debnr,
  docno,
  max(date),
  type,
  num,
  amount

from magical_table
group by
  debnr,
  docno,     
  type,
  num,
  amount

答案 1 :(得分:0)

您可以GROUP使用上面给出的示例聚合,但是如果amount字段不相同,那么您可以使用ROW_NUMBER()函数来实现此目的避免需要聚合:

;WITH cte AS (SELECT *
                    ,CASE WHEN TYPE = 'P' THEN ROW_NUMBER() OVER(PARTITION BY debnr ORDER BY (SELECT 1)) 
                          ELSE 0 
                     END AS RN
              FROM Table1)
SELECT *
FROM cte
WHERE RN <= 1

演示:SQL Fiddle

ORDER BY (SELECT 1)可以更改为任何字段,如果您不想要最小/最大值,这只是获取任意结果的一种方法。

答案 2 :(得分:0)

想要排除“我”未分组的类型吗?

select debnr, docno, max(date), type,  num,  amount
  from magical_table 
  where type = "P"
  group by debnr, docno, type, num, amount
  UNION
  select debnr, docno, date, type,  num,  amount
  from magical_table 
  where type = "I"