SQL query - WHERE (MAX) AND (= VALUE)



我有一个大约有1000行的表。这些行包含IDIDUSERDESCRIPTIONDATE
对于特定的IDUSER,我需要获得具有MAXDATEDESCRIPTION

在这个例子中,我需要得到"ASD"描述

ID ID用户描述日期----------------------------------------------1截至2018年4月16日2 2018年10月4日第1季度3 2 ZXC 2018年1月3日420亿2018年1月26日5 2 JKL 2018年2月5日6 3 IOP 2018年3月14日7 4 RTY 2018年1月13日

我正在尝试类似的东西

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的日期是唯一的(:

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函数的行。注意别名TTM很重要:

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中的一个保留关键字。因此,如果要在查询中使用它,则必须将其声明为分隔的标识符(即用双引号将标识符括起来(。

相关内容

  • 没有找到相关文章

最新更新