我有一个约有1000行的表。这些行包含ID
,IDUSER
,DESCRIPTION
和DATE
。
我需要为特定的DESCRIPTION
获得DATE
和MAX 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)
它不起作用,也许有人可以帮我解决这个问题?
答案 0 :(得分:5)
对于特定用户,请使用top (1)
:
SELECT TOP (1) DESCRIPTION
FROM TABLE
WHERE IDUSER = 1
ORDER BY DATE DESC;
为了提高性能,您希望在(IDUSER, DATE)
上建立索引。
答案 1 :(得分:3)
有几种方法可以做到这一点。在这种情况下,开窗功能通常是最好和最简单的解决方案:
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
对于这种确切的情况,后两个选项的效率应该较低,但是在某些情况下它们可以更好地工作。
答案 2 :(得分: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
如果删除最后一行,您将看到逻辑所在,即根据相关的IDUSER
为每个DATE
应用行号
答案 3 :(得分:1)
您可以使用Correlated subquery来限制应用于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中的Reserved Keyword。因此,如果要在查询中使用它,则必须将其声明为带分隔符的标识符(即,标识符用双引号引起来)。