Sql 如何根据当前记录的生效日期获取当前记录?

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

如何根据当前记录的生效日期获取当前记录?我应该使用子查询吗?除了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 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环境。好的,让我运行一些测试。谢谢你帮我做这件事