Sql 返回重复的值
我正在尝试根据以下内容获取所有重复记录:Sql 返回重复的值,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我正在尝试根据以下内容获取所有重复记录: accession_id, check_num, procedure_code, paid_amt, 此查询将返回上述字段以及这些字段的重复次数 但是,我只想返回那些发生多次的 select ACCESSION_PAYMENTS_DAILY_KEY, accession_id, check_num, procedure_code, paid_amt, row_number() over
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
如果要在
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
也许你应该试试GROUPBY/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之后的记录也许您应该尝试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之后过滤记录我不知道表是如何索引的,但是自左连接呢?它可能值得测试,但我无法想象它比上述两种方法都快。我甚至不会尝试这个,除非登录id和检查编号被索引
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
我不知道您的表是如何索引的,但是自左连接呢?它可能值得测试,但我无法想象它比上述两种方法都快。我甚至不会尝试这个,除非登录id和检查编号被索引
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
试试这个:
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
)
也许是另一种选择
;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
)
无效列错误是因为您试图在
WHERE
子句中使用别名。如果您想使用别名,则需要将查询包装在另一个SELECT
中,非常感谢。您能告诉我怎么做吗?无效列错误是因为您试图在WHERE
子句中使用别名。如果您想使用别名,则需要将查询包装在另一个SELECT
中,非常感谢。你能告诉我怎么做吗?事情是这样的。内部select返回大约1000万行,执行时间很长。我怎样才能加快它的速度?除了过滤之外,您是否打算将事件用于其他用途?如果不是,那么考虑使用<<代码>组的和<代码>具有< /代码>字符。另一个答案中的用户提出了这个建议。然而,正如你们所知,分区/覆盖工作得更快。我知道它更慢,这就是为什么我对它做了评论,并没有编辑我的答案。你的桌子上有索引吗?事情是这样的。内部select返回大约1000万行,执行时间很长。我怎样才能加快它的速度?除了过滤之外,您是否打算将事件用于其他用途?如果不是,那么考虑使用<<代码>组的和<代码>具有< /代码>字符。另一个答案中的用户提出了这个建议。然而,正如你们所知,分区/覆盖工作得更快。我知道它更慢,这就是为什么我对它做了评论,并没有编辑我的答案。你的表上有索引吗?+1非常感谢你的帮助,但是你的方法比我的慢得多+1非常感谢你的帮助,但是你的方法比我在SSMS中写的慢得多;然后抄成这样回答;然后突出显示并使用SSMS中写入的{}按钮;然后抄成这样回答;然后突出显示并使用{}按钮。