Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 返回重复的值_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

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中写入的{}按钮;然后抄成这样回答;然后突出显示并使用{}按钮。