繁体   English   中英

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

[英]SQL query - WHERE (MAX) AND (= VALUE)

我有一个大约1000行的表。 这些行包含IDIDUSERDESCRIPTIONDATE
我需要获得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函数的行。 注意别名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中的保留关键字 因此,如果要在查询中使用它,则必须将其声明为分隔标识符 (即用双引号括起标识符)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM