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
假设ID
和Name
是固定键。但是,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。
给定以下数据:
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
假设ID
和Name
是固定键。但是,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。