Sql 如何根据当前记录的生效日期获取当前记录?
如何根据当前记录的生效日期获取当前记录?我应该使用子查询吗?除了MAX还有什么我可以用的吗 我有这些表格示例Sql 如何根据当前记录的生效日期获取当前记录?,sql,sql-server-2008,Sql,Sql Server 2008,如何根据当前记录的生效日期获取当前记录?我应该使用子查询吗?除了MAX还有什么我可以用的吗 我有这些表格示例 ResourceID is the ID number of the Resource. OrganizationId is the current Organization or Department of the Resource. Effective Date is the start date or the first day of the Resource in an Org
ResourceID is the ID number of the Resource.
OrganizationId is the current Organization or Department of the Resource.
Effective Date is the start date or the first day of the Resource in an Organization.
ResourceID OrganizationID EffectiveDate
VC1976 INTIN1HTHWYAMM 2009-12-23 00:00:00.000
VC1976 INTIN1LGAMMAMS 2011-07-01 00:00:00.000
VC1976 SMESM1HTOVEOVE 2012-07-01 00:00:00.000
VC1976 APCAP1HTOVEOVE 2012-07-09 10:17:56.000
ResourceID OrganizationID EffectiveDate
JV2579 VNMVN1HTHWYCMM 2009-07-01 00:00:00.000
JV2579 INTIN1HTHWYCMM 2011-07-02 00:00:00.000
JV2579 SMESM1HTOVEOVE 2012-07-01 00:00:00.000
ResourceID OrganizationID EffectiveDate
RJ1939 INTIN1HTOVEOVE 1995-01-30 00:00:00.000
RJ1939 INTIN1HTOVEOVE 2007-07-25 00:00:00.000
RJ1939 SMESM1HTOVEOVE 2012-07-01 00:00:00.000
ResourceID OrganizationID EffectiveDate
PJ8828 AREAR1HTHWYRHD 2012-04-01 00:00:00.000
PJ8828 SMESM1HTOVEOVE 2012-07-01 00:00:00.000
ResourceID OrganizationID EffectiveDate
RS1220 INTIN1HTHWYCMM 1981-01-06 00:00:00.000
RS1220 SMESM1HTOVEOVE 2012-07-01 00:00:00.000
我的目标是获取当前属于用户输入的OrganizationUnit的所有ResourceID。例如,如果用户将SMESM1HTOVE放入OrganizationID参数中,则会拉出当前处于SMESM1HTOVE下的所有ReourceID。到目前为止,我下面的MAX查询不起作用
select OrganizationID, ResourceID, MAX(EffectiveDate) as EffectiveDate from ResourceOrganization
where OrganizationID = 'SMESM1HTOVEOVE'
group by OrganizationID, ResourceID, EffectiveDate
下面是我上面简短的MAX查询的结果。这是错误的,因为ResourceID VC1976目前属于APCAP1HTOVE,生效日期为2012-07-09 10:17:56.000
OrganizationID ResourceID EffectiveDate
SMESM1HTOVEOVE JV2579 2012-07-01 00:00:00.000
SMESM1HTOVEOVE PJ8828 2012-07-01 00:00:00.000
SMESM1HTOVEOVE RJ1939 2012-07-01 00:00:00.000
SMESM1HTOVEOVE RS1220 2012-07-01 00:00:00.000
SMESM1HTOVEOVE VC1976 2012-07-01 00:00:00.000
有人能帮忙提供他们的意见吗?因为我将在下面的存储过程中使用它。我还将包括我的程序供您自己阅读
谢谢大家!
create table #Resources
(
ResourceID nvarchar(30),
OrganizationID nvarchar(15),
EffectiveDate datetime,
TimeEntryDate datetime
)
if @ResourceID <> ''
begin
insert into #Resources (ResourceID,OrganizationID,EffectiveDate)
select ro.ResourceID, ro.OrganizationID, ro.EffectiveDate from ResourceOrganization ro,
(select ResourceID, MAX(EffectiveDate) as maxEffectivedate from dbo.ResourceOrganization
where ResourceID = @ResourceID
group by ResourceID) as maxresults
where ro.ResourceID = maxresults.ResourceID
and ro.EffectiveDate = maxresults.maxEffectivedate
end
else if @OrgUnit <> ''
begin
insert into #Resources (ResourceID,OrganizationID,EffectiveDate)
select ro.ResourceID, ro.OrganizationID, ro.EffectiveDate from ResourceOrganization ro,
(select ResourceID, MAX(EffectiveDate) as maxEffectivedate from dbo.ResourceOrganization
where OrganizationID like '' + @OrgUnit + '%'
group by ResourceID) as maxresults
where ro.ResourceID = maxresults.ResourceID
and ro.EffectiveDate = maxresults.maxEffectivedate
else if @ResourceID <> '' and @OrgUnit <> ''
begin
insert into #Resources (ResourceID,OrganizationID,EffectiveDate)
select ro.ResourceID, ro.OrganizationID, ro.EffectiveDate
from ResourceOrganization ro,
(select ResourceID, MAX(EffectiveDate) as maxEffectivedate from dbo.ResourceOrganization
where ResourceID = @ResourceID
group by ResourceID) as maxresults
where ro.ResourceID = maxresults.ResourceID
and ro.EffectiveDate = maxresults.maxEffectivedate
end
我想还有其他方法可以做到这一点,但我认为这是可行的:
DECLARE
@OrganizationID varchar(40)
SET @OrganizationID = 'SMESM1HTOVEOVE'
SELECT
ro.ResourceID,
ro.OrganizationID,
max(ro.EffectiveDate)
FROM
ResourceOrganization ro
WHERE
ro.OrganizationID = @OrganizationID
GROUP BY
ro.ResourceID,
ro.OrganizationID
HAVING
max(ro.EffectiveDate) = (
SELECT
max(EffectiveDate)
FROM
ResourceOrganization
WHERE
ResourceID = ro.ResourceID)
这里有一个游戏
编辑:事实上,这可能太复杂了。试试这个:
DECLARE
@OrganizationID varchar(40)
SET @OrganizationID = 'SMESM1HTOVEOVE'
SELECT
ro.ResourceID,
ro.OrganizationID,
ro.EffectiveDate
FROM
ResourceOrganization ro
WHERE
ro.OrganizationID = @OrganizationID
AND ro.EffectiveDate = (
SELECT
max(EffectiveDate)
FROM
ResourceOrganization
WHERE
ResourceID = ro.ResourceID)
您也可以使用CTE进行尝试
;WITH tmpWithUID As
(
SELECT Row_Number() OVER(ORDER BY ResourceID, EffectiveDate, OrganizationID) AS rowNumber,
ResourceID, OrganizationID, EffectiveDate
FROM dbo.ResourceOrganization
GROUP BY ResourceID, EffectiveDate, OrganizationID
)
SELECT ResourceID, OrganizationID, EffectiveDate
FROM tmpWithUID
WHERE tmpWithUID.rowNumber IN (
SELECT max(rowNumber) rowNumber
FROM tmpWithUID
GROUP BY ResourceID
)
AND OrganizationID = 'SMESM1HTOVEOVE'
你可以用光标试试。本例仅输出到屏幕,但如果希望通过SQLDataAdapter等执行,可以将结果插入临时表,然后返回结果
SET NOCOUNT ON;
DECLARE tmpCursor CURSOR FOR
SELECT DISTINCT ResourceID
FROM ResourceOrganization
ORDER BY 1
OPEN tmpCursor
DECLARE @resID VARCHAR(12)
DECLARE @orgID VARCHAR(12)
DECLARE @effDate INT
FETCH NEXT FROM tmpCursor INTO @resID
PRINT '----------- -------------- ------------------'
PRINT 'Resource ID OrganizationID Effective Date'
PRINT '----------- -------------- ------------------'
WHILE @@FETCH_STATUS = 0 BEGIN
SELECT @effDate = MAX(EffectiveDate)
FROM ResourceOrganization
WHERE ResourceID = @resID
SELECT TOP 1 @orgID = OrganizationID
FROM ResourceOrganization
WHERE ResourceID = @resID AND EffectiveDate = @effDate
PRINT @resID + ' ' + @orgID + ' ' + CONVERT(VARCHAR(24), @effDate, 109)
FETCH NEXT FROM tmpCursor INTO @resID
END
PRINT '----------- -------------- ------------------'
CLOSE tmpCursor
DEALLOCATE tmpCursor
GO
您的表中有任何唯一的键吗?那会更容易。嗨,杰德。不,它没有任何独特的桌子。你太棒了。谢谢你,泽克!我还比较了Zec示例,当我查看执行计划时,我的脚本运行时有10%的差异。但我不确定是否适合其他SQL Server环境。好的,让我运行一些测试。谢谢你帮我做这件事