从SQL查询获取最大日期

从SQL查询获取最大日期,sql,sql-server,max,Sql,Sql Server,Max,查询如下所示,但似乎工作不正常,只需要包含费用最新开始日期的行: SELECT Loc.[PLACE-REF], Tenant.[TENANCY-REF], PChar.[ACCOUNT-CODE], MAX (PChar.[START-DATE]) AS "START-DATE", PChar.[NET-AMT] AS [PREVIOUS-MEALS-NET-AMOUNT] FROM dbo.[RE-TENANCY] AS TenanT LEFT OUTER JOIN dbo.[RE-T

查询如下所示,但似乎工作不正常,只需要包含费用最新开始日期的行:

SELECT 

Loc.[PLACE-REF],
Tenant.[TENANCY-REF],
PChar.[ACCOUNT-CODE],
MAX (PChar.[START-DATE]) AS "START-DATE",
PChar.[NET-AMT] AS [PREVIOUS-MEALS-NET-AMOUNT]

FROM
dbo.[RE-TENANCY] AS TenanT
LEFT OUTER JOIN
dbo.[RE-TNCY-PLACE] AS TncyPlace ON TncyPlace.[TNCY-SYS-REF] = TenanT.[TNCY-SYS-REF]
LEFT OUTER JOIN
dbo.[IH-LOCATION] AS Loc ON Loc.[PLACE-REF] = TncyPlace.[PLACE-REF]
LEFT OUTER JOIN
dbo.[IH-PLACE-CHG] AS PChar ON Pchar.[PLACE-REF] = Loc.[PLACE-REF]

WHERE

(
    (Pchar.[START-DATE] = '04/01/2016') 
    OR 
    (Pchar.[START-DATE] BETWEEN '11/01/2016' AND '03/31/2017')
)
AND
Tenant.[TNCY-STATUS] = 'CUR'        
AND
PChar.[ACCOUNT-CODE] = 'MEALS'  
AND
Loc.[PLACE-REF] = '166CHA010'

GROUP BY

Loc.[PLACE-REF],
Tenant.[TENANCY-REF],
PChar.[ACCOUNT-CODE],
PChar.[NET-AMT]

ORDER BY

Loc.[PLACE-REF]

我的查询没有选择最新日期,我不确定为什么


谢谢

我建议您先删除组,然后改为全选(*)。结果中的最晚日期是什么?我怀疑不是这样。

您应该通过/
选择

将查询分为两部分,从您的
组中删除
PChar。[NET-AMT]
。选择只包含最长日期的“键”,然后连接到一个类似的查询,在键上加上最长日期。 例如:

select B.* from 
  (select PLACE-REF, TENANCY-REF, ACCOUNT-CODE, MAX (START-DATE) AS "START-DATE" from tables...) A 
inner join 
  (select PLACE-REF, TENANCY-REF, ACCOUNT-CODE, START-DATE, NET-AMT AS [PREVIOUS-MEALS-NET-AMOUNT] from tables...) B  
 on A.PLACE-REF = B.PLACE-REF and A.TENANCY-REF = B.TENANCY-REF and A.ACCOUNT-CODE = B.ACCOUNT-CODE and A.START-DATE = B.START-DATE

从你现在的问题来看,你不太清楚你想检索什么数据。然而,通常情况下,row_number函数应该可以帮助您根据分组和排名获得一行(也有一个排名函数,但现在让我们使用row_number运行)。就你的问题而言,像这样的事情可能就是你想要的

SELECT * FROM
(SELECT 
  Loc.[PLACE-REF],
  Tenant.[TENANCY-REF],
  PChar.[ACCOUNT-CODE],
  PChar.[START-DATE],
  ROW_NUMBER() OVER (PARTITION BY Loc.[PLACE-REF],
      Tenant.[TENANCY-REF],
      PChar.[ACCOUNT-CODE]
    ORDER BY PChar.[START-DATE] DESC) AS rownum,
  PChar.[NET-AMT] AS [PREVIOUS-MEALS-NET-AMOUNT]
FROM
dbo.[RE-TENANCY] AS TenanT
LEFT OUTER JOIN
dbo.[RE-TNCY-PLACE] AS TncyPlace ON TncyPlace.[TNCY-SYS-REF] = TenanT.[TNCY-SYS-REF]
LEFT OUTER JOIN
dbo.[IH-LOCATION] AS Loc ON Loc.[PLACE-REF] = TncyPlace.[PLACE-REF]
LEFT OUTER JOIN
dbo.[IH-PLACE-CHG] AS PChar ON Pchar.[PLACE-REF] = Loc.[PLACE-REF]
WHERE
(
    (Pchar.[START-DATE] = '04/01/2016') 
    OR 
    (Pchar.[START-DATE] BETWEEN '11/01/2016' AND '03/31/2017')
)
AND Tenant.[TNCY-STATUS] = 'CUR'        
AND PChar.[ACCOUNT-CODE] = 'MEALS'  
AND Loc.[PLACE-REF] = '166CHA010') A
WHERE A.rownum = 1
ORDER BY A.[PLACE-REF]

这是从内存中编写的,因此它可能无法完美工作,但它应该很接近,并且似乎是您想要获取所需数据的地方。

如果您只需要最上面一行

SELECT TOP 1
Loc.[PLACE-REF],
Tenant.[TENANCY-REF],
PChar.[ACCOUNT-CODE],
PChar.[START-DATE],
PChar.[NET-AMT] AS [PREVIOUS-MEALS-NET-AMOUNT]
FROM
dbo.[RE-TENANCY] AS TenanT
LEFT JOIN dbo.[RE-TNCY-PLACE] AS TncyPlace 
    ON TncyPlace.[TNCY-SYS-REF] = TenanT.[TNCY-SYS-REF]
LEFT JOIN dbo.[IH-LOCATION] AS Loc 
    ON Loc.[PLACE-REF] = TncyPlace.[PLACE-REF]
LEFT JOIN dbo.[IH-PLACE-CHG] AS PChar 
    ON Pchar.[PLACE-REF] = Loc.[PLACE-REF]
WHERE
(
    (Pchar.[START-DATE] = '04/01/2016') 
    OR 
    (Pchar.[START-DATE] BETWEEN '11/01/2016' AND '03/31/2017')
)
AND Tenant.[TNCY-STATUS] = 'CUR'        
AND PChar.[ACCOUNT-CODE] = 'MEALS'  
AND Loc.[PLACE-REF] = '166CHA010'
ORDER BY PChar.[START-DATE] DESC
;

克里斯·弗林的解决方案很有效。谢谢大家

SELECT * FROM
(SELECT 
  Loc.[PLACE-REF],
  Tenant.[TENANCY-REF],
  PChar.[ACCOUNT-CODE],
  PChar.[START-DATE],
  ROW_NUMBER() OVER (PARTITION BY Loc.[PLACE-REF],
      Tenant.[TENANCY-REF],
      PChar.[ACCOUNT-CODE]
    ORDER BY PChar.[START-DATE] DESC) AS rownum,
  PChar.[NET-AMT] AS [PREVIOUS-MEALS-NET-AMOUNT]
FROM
dbo.[RE-TENANCY] AS TenanT
LEFT OUTER JOIN
dbo.[RE-TNCY-PLACE] AS TncyPlace ON TncyPlace.[TNCY-SYS-REF] = TenanT.[TNCY-SYS-REF]
LEFT OUTER JOIN
dbo.[IH-LOCATION] AS Loc ON Loc.[PLACE-REF] = TncyPlace.[PLACE-REF]
LEFT OUTER JOIN
dbo.[IH-PLACE-CHG] AS PChar ON Pchar.[PLACE-REF] = Loc.[PLACE-REF]
WHERE
(
    (Pchar.[START-DATE] = '04/01/2016') 
    OR 
    (Pchar.[START-DATE] BETWEEN '11/01/2016' AND '03/31/2017')
)
AND Tenant.[TNCY-STATUS] = 'CUR'        
AND PChar.[ACCOUNT-CODE] = 'MEALS'  
`enter code here`AND Loc.[PLACE-REF] = '166CHA010') A
WHERE A.rownum = 1
ORDER BY A.[PLACE-REF]

请添加一些数据、您看到的内容和您期望的内容。如果您描述您的表/模式,这将很有帮助