如何从最近的日期获取列值?

时间:2018-03-27 01:20:27

标签: sybase-ase

在Sybase ASE上运行此命令。 我得到一个错误子查询返回超过1的值。当子查询跟随=等等时,这是非法的。

在子查询中,我试图按日期选择最新值。

数据会是这样的 Doc_no用户日期 AA琼斯2018年3月23日 AA steph 2018年3月10日 BB dan 2018年1月1日 BB jon 2010年1月1日

在这个例子中,我应该返回2个值来加入并显示。 AA应该显示琼斯 BB应该显示dan,因为他们有最新的日期。 数据实际上是数百万行要搜索。

use mydb_hist
go
select
d.doc_no,
d.doc_short_name,
d.doc_name,
r.doc_no,
r.revision_code,
r.revision,
r.description,
d.last_update,
d.document_category_code,
d.business_group_code,
(case
when substring(grp.group_name,1,10) = 'GEL IPP Do' THEN 'Yes'
else 'No'
END) as 'GEL',
(SELECT d2.index_user_id
       FROM   document_instance d2
        WHERE  d2.doc_no     = d1.doc_no
        and    d2.entry_time = (select max(d3.entry_time)
                                from   document_instance d3
                                where  d3.doc_no = d1.doc_no)
       ) as 'last indexed by'
from documents d
join document_revision r on r.doc_no = d.doc_no
left join mydb..document_type_group grp on grp.doc_no = d.doc_no and substring(grp.group_name,1,10) = 'Leg PII Do'
left join mydb..document_instance d1 on d1.doc_no = d.doc_no
where d.dbOprnCD = 'I'
and d.last_update > '1 Jan 2018'

--and grp.group_name LIKE 'GEL%' --shortened this so the substring in the group by matches, getting a server error for the work table size otherwise

group by d.doc_no,
d.doc_short_name,
d.doc_name,
r.doc_no,
r.revision_code,
r.revision,
r.description,
d.last_update,
d.document_category_code,
d.business_group_code,
substring(grp.group_name,1,10)

1 个答案:

答案 0 :(得分:0)

这个怎么样?
如果index_user_id对于给定的doc_no和entry_date不是唯一的,那么您需要将子选择移动到下面的连接。这将允许您在group by子句中包含index_user_id。

use mydb_hist
go
select
d.doc_no,
d.doc_short_name,
d.doc_name,
r.doc_no,
r.revision_code,
r.revision,
r.description,
d.last_update,
d.document_category_code,
d.business_group_code,
(case
when substring(grp.group_name,1,10) = 'GEL IPP Do' THEN 'Yes'
else 'No'
END) as 'GEL',
d1.index_user_id as 'last indexed by'
from documents d
join document_revision r on r.doc_no = d.doc_no
left join mydb..document_type_group grp on grp.doc_no = d.doc_no and substring(grp.group_name,1,10) = 'Leg PII Do'
left join mydb..document_instance d1 on d1.doc_no = d.doc_no and d1.entry_time = (select max(d3.entry_time)
                                                                                  from   mydb..document_instance d3
                                                                                  where  d3.doc_no = d1.doc_no)
where d.dbOprnCD = 'I'
and d.last_update > '1 Jan 2018'
group by d.doc_no,
d.doc_short_name,
d.doc_name,
r.doc_no,
r.revision_code,
r.revision,
r.description,
d.last_update,
d.document_category_code,
d.business_group_code,
substring(grp.group_name,1,10)
d1.index_user_id