sql select语句检查相同id的先前记录

时间:2015-03-23 12:53:40

标签: sql-server tsql select

我正在尝试构建一个查询,该查询将检查为当前日期添加的记录。我想为每条记录采用唯一的company_id,并检查这些company_id的历史记录,如果记录存在几乎相同的document_date(上一年:f.eg:doc date是2014/12/31,之前的记录将是有2013/21/31)。

到目前为止,我已经说明了我能够从当前添加的记录中提取每个company_id并显示特定文档类型的最新文档日期

在伪代码中:

select company_id, MAX(document_date), document_type
from submissions
where company_id in
(
select distinct company_id
from submissions
where filing_date = current date
)
and document_type = 'annual'
group by company_id, document_type

我希望能够从当前添加的记录中获取document_type值,并检查具有相同值的先前记录,但是如上所述document_date的位置。我是否需要为此构建过程,或者是否可以在select语句中执行此过程?

3 个答案:

答案 0 :(得分:1)

试试这个:

; WITH cte AS (
  SELECT company_id
       , document_date
       , document_type
       , Row_Number() OVER (PARTITION BY company_id ORDER BY document_date DESC) As sequence
  FROM   submissions
  WHERE  document_type = 'Annual'
)
SELECT current_record.company_id
     , current_record.document_date
     , current_record.document_type
     , next_record.document_date As next_record_document_date
     , next_record.document_type As next_record_document_type
FROM   cte As current_record
 LEFT    /* outer join as we might not always have a "next" result */
  JOIN cte As next_record
    ON next_record.company_id = current_record.company_id
   AND next_record.sequence   = current_record.sequence + 1
WHERE  current_record.sequence = 1 /* Limit to the "first" record */
AND    current_record.filing_date = Current_Timestamp
;

这使用窗口函数Row_Number()为每条记录分配一个......行号.... PARTITION BY子句为每个company_id重置此行号。行号的顺序由此函数的ORDER BY部分确定(即document_date DESC)。

一旦我们获得了这些信息,我们就可以执行自我加入以加入“当前”和“下一个”记录。

答案 1 :(得分:1)

select s1.company_id, s1.document_date, s2.document_date
  from submissions s1 
  join submissions s2
    on s2.company_id = s1.company_id 
   and s2.document_date = dateadd(yy, -1, s1.document_date) 
   and s2.document_type = 'annual'
   and s1.document_type = 'annual'

答案 2 :(得分:0)

我们的想法是从提交表中选择当前日期的文档,然后CROSS(或OUTER)将它应用到同一company_id和document_type上的提交表,其中filing_date是当前日期的年份:

select s.*, x.*
from submissions s
cross apply (
  select top (1) *
  from submissions s2
  where s.company_id = s2.company_id
  and s.document_type = s2.document_type
  and s.filing_date = dateadd(year, 1, s2.filing_date)
) x
where filing_date = @current_date

请用所需的列名替换'*'。

TOP (1)只是从子查询中拉出一行。