SQL Where 子句变量需要每行不同

SQL Where clause variable needs to differ per row

给定以下数据:

 ID, Name, Location, Date
 1,  Tom,  Boston, 8/12/2015
 1,  Tom,  Lowell, 7/12/2015
 1,  Tom,  Wakefield, 6/12/2015
 2,  Jake, Salem, 12/15/2018
 2,  Jack, Worcester, 5/12/2015

如何编写一个 SQL 查询,该查询将 return 一个 table 仅包含具有最大日期的行,例如:

ID, Name, Location, Date
 1,  Tom,  Boston, 8/12/2015
 2,  Jake, Salem, 12/15/2018

假设IDName是固定键。但是,location 可能是可变的,应该 returned 的 location 将是与最大值 date 关联的那个。

我目前最接近的尝试只是 return 获取所有日期中的最大值,而不是 ID / Name 对的最大日期记录。例如:

SELECT ID, NAME, Location, Data
 FROM Table A
 WHERE Date = (SELECT MAX(Date) FROM Table B WHERE A.ID = B.ID and A.Name = B.Name)

仅产量:

2,  Jake, Salem, 12/15/2018

像这样的东西有效:

select ID, Name, Location, Date
from (
  select *, row_number() over (partition by ID order by Date desc) as RN
  from yourtable
) X
where RN = 1

行号会为行添加一个序号,按日期降序排列,分区方式是每次ID改变时重新开始编号。

如果您需要获取多行以防同一天有几行,请使用 rank() 而不是 row_number()

您可以通过按 Id 字段分组找到最大日期。然后join跟主table求最后的结果

SELECT X.*
FROM @T X INNER JOIN 
                    (
                        SELECT A.ID,MAX(A.Date) MaxDate
                        FROM @T A
                        GROUP BY A.ID
                                        ) Y 
ON X.ID = Y.Id AND x.Date = Y.MaxDate
ORDER BY Y.ID

你也可以试试这个:

SELECT  a.ID, a.NAME, a.Location, a.Date
FROM  Table a
LEFT JOIN Table as b 
ON  b.ID = a.ID AND  b.Date > a.Date
WHERE  b.ID is NULL

试试这个

Select ID,Name,Location,max(Date) as Date 
FROM table_name 
group by ID

希望这有效。

方法一:

SELECT A.* FROM [Table] A
JOIN (
    SELECT ID, Name, MAX([Date]) MaxDate
    FROM [Table]
    GROUP BY ID, Name
) B ON B.ID = A.ID AND B.Name = A.Name AND B.MaxDate = A.[Date]

方法二:

SELECT ID, Name, [Location], [Date] FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY ID, Name ORDER BY [Date] DESC) R
    FROM [Table]
) T
WHERE R = 1

示例:

DECLARE @T TABLE (
    ID INT,
    Name VARCHAR(16),
    [Location] VARCHAR(16),
    [Date] DATE
)

INSERT @T VALUES
(1, 'Tom', 'Boston', '8/12/2015'),
(1, 'Tom', 'Lowell', '7/12/2015'),
(1, 'Tom', 'Wakefield', '6/12/2015'),
(2, 'Jake', 'Salem', '12/15/2018'),
(2, 'Jack', 'Worcester', '5/12/2015')

SELECT A.* FROM @T A
JOIN (
    SELECT ID, Name, MAX([Date]) MaxDate
    FROM @T
    GROUP BY ID, Name
) B ON B.ID = A.ID AND B.Name = A.Name AND B.MaxDate = A.[Date]

SELECT ID, Name, [Location], [Date] FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY ID, Name ORDER BY [Date] DESC) R
    FROM @T
) T
WHERE R = 1

你很接近。尝试将 GROUP BY 添加到您的子查询中并将 = 更改为 IN.

SELECT ID, NAME, Location, [Date]
FROM Table A
WHERE Date in ( 
                SELECT MAX(Date) 
                FROM Table B 
                WHERE A.ID = B.ID and A.Name = B.Name 
                GROUP BY ID, Name    )

另一种更好的方法是从子查询创建 view 并在视图中创建 join table。