繁体   English   中英

从SQL查询获取MAX日期

[英]Getting MAX date from SQL Query

查询如下所示,但似乎无法正常工作,仅需要带有最近开始日期的行进行收费:

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]

结果

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

谢谢

我建议您删除分组依据,然后更改为全选(*)。 结果是最新日期吗? 我怀疑不是。

您应该group by / select从您的group by删除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函数应该可以帮助您基于分组和等级来获取行(还有一个rank函数,但现在让我们使用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
;

克里斯·弗林(Chris Flynn)的解决方案很有效。 感谢大家。

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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM