[英]returning values which are duplicated
我正在嘗試基於獲取所有重復的記錄:
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'.
如果記錄不止一次出現,我如何才能返回記錄?
如果要在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
也許您應該嘗試使用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子句過濾GROUP BY之后的記錄
我不知道您的表如何建立索引,但是自左聯接呢? 可能值得測試,但是我無法想象它比以上任何一種方法都要快。 除非為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
嘗試這個:
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
也許替代...
;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
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.