2014-10-30 103 views
0

我有一個select *查詢,它提供了大量的行和大量的結果列。當給出與另一列B相同的值時,我想要只包含一個列,但我有一個列A的重複問題。刪除查詢中的兩列重複

基本上我有一列告訴我對象的「名稱」,另一列告訴我「數字」。有時我有一個對象「名稱」,對於給定的對象「數字」有多個條目。我只希望在「名稱」中使用不同的「數字」,但我希望查詢在真實時給出整個表格,而不僅僅是這兩列。上述

Name Number ColumnC ColumnD 

Bob 1  93  12 

Bob 2  432  546 

Bob 3  443  76 

這個例子是罰款以上

Name Number ColumnC ColumnD 

Bob 1  93  12 

Bob 2  432  546 

Bill 1  443  76 

Bill 2  54  1856 

這個例子是好的

Name Number ColumnC ColumnD 

Bob 1  93  12 

Bob 2  432  546 

Bob 2  209  17 

這上面的例子不是很好,我只希望鮑勃2的之一。

回答

0

通過使用公用表表達式(CTE)和ROW_NUMBER OVER PARTION語法如下:

WITH 
    CTE AS 
    (
    SELECT 
     *, 
     ROW_NUMBER() OVER (PARTITION BY Name, Number ORDER BY Name, Number) AS R 
    FROM 
     dbo.ATable 
)  
    SELECT 
    * 
    FROM 
    CTE 
    WHERE 
    R = 1 
+0

唯一的問題是什麼,如果其他列的值是一樣的例子不同。我不在乎它選擇的是哪一行,只要它唯一的一個唯一的名字,號碼 – bjbreitling 2014-10-30 23:38:21

+0

阿里擊敗了我到我修改後的解決方案 – JohnS 2014-10-31 00:34:47

+0

我會真正快速發佈我生成的代碼。你能告訴我是否有遺漏或失靈的情況嗎?我會發佈一個答案,它的代碼與你剛纔給出的代碼相同,但是與where和order by子句一起工作。出於某種原因,當我執行它時,查詢不起作用。 – bjbreitling 2014-10-31 12:51:09

0

如果你只是想的姓名和號碼,然後

SELECT DISTINCT Name, Number FROM Table1 

如果你想知道每個有多少,然後

SELECT Name, Number, COUNT(*) FROM Table1 GROUP BY Name, Number 
+0

唯一的問題是,如果其他列的值與示例中的值不同。我真的不在乎它選擇的是哪一行,只要它唯一的一個唯一的名稱,編號 – bjbreitling 2014-10-30 23:38:55

+0

您如何確定要顯示的其他列中的哪些值?兩者都必須來自同一行嗎?即(Bob,2,432,17)是否可以接受? – LeeG 2014-10-31 19:47:48

1

如果您使用SQL 2005或更高版本,請嘗試它:

With ranked_records AS 
(
    select *, 
    ROW_NUMBER() OVER(Partition By name, number Order By name) [ranked] 
    from MyTable 
) 
select * from ranked_records 
where ranked = 1 
0
WITH

CTE

AS

SELECT 
    *, 
    ROW_NUMBER() OVER (PARTITION BY Plant, BatchNumber ORDER BY Plant, BatchNumber) AS R 
FROM dbo.StatisticalReports WHERE dbo.StatisticalReports. \!"FermBatchStartTime\!" >= DATEADD(d,-90, getdate()) 

SELECT

* 

FROM

CTE 

WHERE

R = 1 

ORDER BY dbo.StatisticalReports.Plant,dbo.StatisticalReports.FermBatchStartTime

+0

你有錯誤信息嗎?那部分是什麼\「FermBatchStartTime \!」意思。也許你應該讓我看看桌子的結構。 – JohnS 2014-11-02 21:29:33