SQL查询-WHERE(MAX)AND(= VALUE)

时间:2018-12-04 21:02:23

标签: sql sql-server

我有一个约有1000行的表。这些行包含IDIDUSERDESCRIPTIONDATE
我需要为特定的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)

它不起作用,也许有人可以帮我解决这个问题?

4 个答案:

答案 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函数的行。请注意,别名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中的Reserved Keyword。因此,如果要在查询中使用它,则必须将其声明为带分隔符的标识符(即,标识符用双引号引起来)。