[英]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.