3

SQL Server 2008 R2(SP2) 10.50.4263

我在 col1 中有申请号,在 col2 中有首次购买者(ftb)的指示符(0 或 1)。每个申请可以有 1 或 2 名申请人。对于有两个申请人的申请,我得到两个申请条目:

application  ftb
-----------  ---
1234          0
12345         0
12345         1
2345          1
23456         0
23456         0

期望的结果是每个独特的应用程序和 ftb。如果一个应用程序有多个 ftb 值...取最高值(它始终为 0 或 1)。

我想看看这个:

application  ftb
-----------  ---
1234          0
12345         1
2345          1
23456         0

我一直在尝试使用 PARTITION 但......没有任何运气。该表已提供给我,我无法更改。这需要在sql而不是excel中完成。我已经尝试了一百万种排列,甚至自我加入来解决这个问题。卡住。

有好心人能指路吗?

4

4 回答 4

4
SELECT
application,
MAX(ftb) AS ftb
FROM
yourTable
GROUP BY application

我理解您的问题,就像您只想在表中显示所需输出中的行并删除其他行,对吗?实现这一点的最简单方法是使用临时表。

SELECT
application,
MAX(ftb) AS ftb
INTO #yourTempTable
FROM
yourTable
GROUP BY application;

然后删除所有其他行

DELETE FROM yourTable WHERE application IN (SELECT DISTINCT application FROM #yourTempTable)

最后从临时表中再次插入到您的表中。

INSERT INTO yourTable (application, ftb) 
SELECT application, ftb FROM #yourTempTable;

就是这样。

于 2013-06-21T00:35:11.400 回答
0

您可以在 ftb 上使用 max 聚合,并在 application 列上使用 group by:

Select application, Max(ftb) from yourtable group by application;
于 2013-06-21T00:37:46.090 回答
0

假设您还有一个 ID 列:

-- 删除所有也有 1 的零

DELETE FROM yourTable
WHERE ftb = 0 
AND application IN
(SELECT s.application
FROM yourTable AS s
WHERE s.ftb = 1)

-- 只保留每个应用程序的最新消息

DELETE FROM yourTable
WHERE ID NOT IN 
(SELECT MAX(s.ID)
FROM yourTable AS s
GROUP BY s.application)
于 2013-06-21T01:33:23.710 回答
0

要返回列“application”的分区中的行的序列号,请使用排序函数ROW_NUMBER和列“ftb”上的 ORDER BY 子句。所以你可以删除所有重复的行

 ;WITH cte AS
 (
  SELECT ROW_NUMBER() OVER(PARTITION BY application ORDER BY ftb DESC) AS rn
  FROM dbo.YourTable
  )
  DELETE cte
  WHERE rn > 1

请参阅SQLFiddle上的演示

于 2013-06-21T06:35:41.600 回答