简体   繁体   中英

Getting MAX date from SQL Query

Query is as below per below but doesn't appear to be working correctly, just need row with most recent start date for the charge:

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]

Result

My query isn't picking the latest date and I'm unsure why?

Thanks

I suggest you drop the group by and then change to select all (*). Is the latest date in the result? I suspect it is not.

您应该group by / select从您的group by删除PChar.[NET-AMT]

Break your query up in two parts. Have a select that pulls the 'key' with just the max date, then join to a similar query joining on the key plus the max date. For example:

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

It isn't really clear from your question right now what data you're trying to retrieve. However, in general a row_number function should help you to get a row based on a grouping and a rank (there's also a rank function, but let's run with row_number for now). Taking your query, something like this is probably what you're after.

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]

Wrote this from memory so it may not work perfectly, but it should be close, and seems to be what you're looking for to get the data you want.

If you just want the top row...

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
;

Solution from Chris Flynn worked a treat. Thanks everyone.

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]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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