[英]SQL query - WHERE (MAX) AND (= VALUE)
我有一个大约1000行的表。 这些行包含ID
, IDUSER
, DESCRIPTION
和DATE
。
我需要获得DESCRIPTION
与MAX DATE
为特定的IDUSER
。
在示例中,我需要获得“ASD”描述
ID IDUSER DESCRIPTION DATE ---------------------------------------------- 1 1 ASD 4/16/2018 2 1 QWE 4/10/2018 3 2 ZXC 3/01/2018 4 2 BNM 1/26/2018 5 2 JKL 5/02/2018 6 3 IOP 3/14/2018 7 4 RTY 1/13/2018
我正在尝试类似的东西
SELECT DESCRIPTION FROM TABLE WHERE IDUSER = 1 AND DATE = (SELECT MAX(DATE) FROM TABLE)
它不起作用,也许有人可以帮我这个?
对于特定用户,请使用top (1)
:
SELECT TOP (1) DESCRIPTION
FROM TABLE
WHERE IDUSER = 1
ORDER BY DATE DESC;
为了提高性能,您需要一个索引(IDUSER, DATE)
。
有几种方法可以做到这一点。 在这种情况下,窗口函数通常是最好和最简单的解决方案:
SELECT *
FROM (
SELECT DESCRIPTION,
ROW_NUMBER() OVER (PARTITION BY IDUSER ORDER BY [DATE] DESC) AS ROW
FROM [TABLE]
WHERE IDUSER = 1
) t
WHERE row = 1
您也可以通过join / group by(当分区不是那么清楚或者您需要显示来自多个相关表的字段时工作),并且您可以知道每个ID的Date是唯一的:
SELECT t.DESCRIPTION
FROM
(
SELECT IDUSER, MAX(DATE) DT
FROM [Table]
GROUP BY IDUSER
) base
INNER JOIN [Table] t ON t.IDUSER = base.IDUSER AND t.[DATE] = base.DT
WHERE t.IDUSER = 1
或横向连接(如前一个选项,但修复了潜在重复日期的情况):
SELECT u.DESCRIPTION
FROM (SELECT DISTINCT IDUSER FROM [TABLE]) base
OUTER APPLY (
SELECT TOP 1 DESCRIPTION
FROM [TABLE] t
WHERE t.IDUSER = base.IDUSER
ORDER BY t.DATE DESC
) u
WHERE base.IDUSER = 1
对于这种情况,后两个选项应该效率较低,但有些情况下它们可以更好地工作。
这是窗口功能有用的地方
select DESCRIPTION from
(select
*,
RN = row_number() over (partition by IDUSER order by [DATE] desc)
) x
where x.RN = 1 and x.IDUSER = 1
如果删除最后一行,您将看到逻辑是什么,即根据关联的DATE
为每个IDUSER
应用行号
您可以使用Correlated子查询来限制应用于MAX
函数的行。 注意别名T
和TM
很重要:
SELECT
T.DESCRIPTION
FROM "TABLE" T
WHERE T.IDUSER = 1
AND T.DATE = (
SELECT
MAX(TM.DATE)
FROM "TABLE" TM
WHERE TM.IDUSER = T.IDUSER
);
TABLE
是SQL Server中的保留关键字 。 因此,如果要在查询中使用它,则必须将其声明为分隔标识符 (即用双引号括起标识符)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.