2012-08-08 43 views
0

返回值,我想基於讓所有的重複記錄:被複制

accession_id, 
    check_num, 
    procedure_code, 
    paid_amt, 

此查詢將返回上面的次重複那些字段中的號碼。

但是,我只想返回不止一次出現的那些。

select  
    ACCESSION_PAYMENTS_DAILY_KEY, 
    accession_id, 
    check_num, 
    procedure_code, 
    paid_amt, 
    row_number() 
    over 
    (partition by accession_id, check_num,procedure_code,paid_amt order by ACCESSION_PAYMENTS_DAILY_KEY) as occurrence 
      from  [MILLENNIUM_DW_DEV].[dbo].[F_PAYOR_PAYMENTS_DAILY]   
    where PROCEDURE_CODE is not null 
    and PAID_AMT>0 

當我過濾條件occurrence>1添加到上面的查詢,我收到此錯誤:

Msg 207, Level 16, State 1, Line 13 
Invalid column name 'occurrence'. 

如何僅如果它們發生不止一次,我可以返回記錄?

+0

無效列錯誤因爲你正試圖在'WHERE'子句中使用別名。如果你想使用你的別名,那麼你將需要把你的查詢包裝在另一個'SELECT' – Taryn 2012-08-08 23:36:23

+0

非常感謝你。你能告訴我我該怎麼做? – 2012-08-08 23:36:39

回答

2

如果要在WHERE子句中使用別名,則可以將其包裝在另一個SELECT語句中。

SELECT * 
FROM 
(
    select ACCESSION_PAYMENTS_DAILY_KEY, 
    accession_id, 
    check_num, 
    procedure_code, 
    paid_amt, 
    row_number() over (partition by accession_id, check_num,procedure_code,paid_amt order by ACCESSION_PAYMENTS_DAILY_KEY) as occurrence 
    from  [MILLENNIUM_DW_DEV].[dbo].[F_PAYOR_PAYMENTS_DAILY]   
    where PROCEDURE_CODE is not null 
    and PAID_AMT>0 
) x 
WHERE x.occurrence>1 
+0

這是事情。內部選擇返回1000萬行,執行需要很長時間。我如何加快速度? – 2012-08-08 23:41:00

+0

你打算如何使用事件來進行其他任何事情,但要過濾?如果不是,請考慮使用「GROUP BY」和「HAVING」子句。 – Taryn 2012-08-09 00:20:07

+0

用戶在其他答案中提出了這個問題。但正如你所知道的分區/結束工作速度更快 – 2012-08-09 00:22:09

1

也許你應該嘗試GROUP BY/HAVING子句:

SELECT accession_id, check_num, procedure_code, paid_amt, 
     COUNT(ACCESSION_PAYMENTS_DAILY_KEY) as occurrences 
FROM [MILLENNIUM_DW_DEV].[dbo].[F_PAYOR_PAYMENTS_DAILY] 
GROUP BY accession_id, check_num, procedure_code,paid_amt 
HAVING COUNT(ACCESSION_PAYMENTS_DAILY_KEY) > 1 

HAVING子句過濾後組記錄由

+0

+1非常感謝您的幫助,但您的方法比我的速度慢得多 – 2012-08-09 00:21:45

1

我已經沒有知道如何你的表建立索引,但是自我離開的加入呢?這可能值得進行測試,但我無法想象它比上述任何一種方法都快。我甚至不會嘗試這一點,除非accession_id和check_num被索引...

Select 
    t1.* 
from [MILLENNIUM_DW_DEV].[dbo].[F_PAYOR_PAYMENTS_DAILY] as t1 
left join [MILLENNIUM_DW_DEV].[dbo].[F_PAYOR_PAYMENTS_DAILY] as t2 
    on t2.accession_id = t1.accession_id 
    and t2.check_num = t1.check_num 
    and t2.procedure_code = t1.procedure_code 
    and t2.paid_amt = t1.paid_amt 
where t2.ACCESSION_PAYMENTS_DAILY_KEY is null 
1

試試這個:

select accession_id, 
    check_num, 
    procedure_code, 
    paid_amt, 
    COUNT(*) as occurrance 
    from  [MILLENNIUM_DW_DEV].[dbo].[F_PAYOR_PAYMENTS_DAILY]   
    where PROCEDURE_CODE is not null 
    and PAID_AMT>0 
    group by accession_id,check_num,procedure_code,paid_amt 
    having COUNT(*) > 1 
1

也許替代...

;WITH MoreOne_CTE() 
    AS 
    (
    SELECT  
     ACCESSION_PAYMENTS_DAILY_KEY 
    FROM [MILLENNIUM_DW_DEV].[dbo].[F_PAYOR_PAYMENTS_DAILY]  
    GROUP BY 
      accession_id,  
      check_num, 
      procedure_code, 
      paid_amt 
    HAVING COUNT(*) > 1  
    ) 
SELECT  
     ACCESSION_PAYMENTS_DAILY_KEY ,  
     accession_id,  
     check_num, 
     procedure_code, 
     paid_amt   
FROM [MILLENNIUM_DW_DEV].[dbo].[F_PAYOR_PAYMENTS_DAILY] x 
WHERE 
     PROCEDURE_CODE IS NOT NULL 
     AND PAID_AMT>0 
     AND EXISTS 
      (
        SELECT 1 
        FROM MoreOne_CTE y 
        WHERE x.ACCESSION_PAYMENTS_DAILY_KEY = y.ACCESSION_PAYMENTS_DAILY_KEY 
      ) 
+0

您是如何很好地格式化它的? – 2012-08-09 15:31:46

+0

在SSMS中寫過;然後複製到SO答案;然後突出顯示並使用{}按鈕。 – whytheq 2012-08-10 10:59:43