我正在尝试构建一个查询,该查询将检查为当前日期添加的记录。我想为每条记录采用唯一的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语句中执行此过程?
答案 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)
只是从子查询中拉出一行。