首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Where子句变量需要每行不同

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

Stack Overflow用户
提问于 2016-11-19 14:19:20
回答 6查看 66关注 0票数 1

给定以下数据:

代码语言:javascript
复制
 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查询来返回一个只包含最大日期的行的表,例如:

代码语言:javascript
复制
ID, Name, Location, Date
 1,  Tom,  Boston, 8/12/2015
 2,  Jake, Salem, 12/15/2018

假设IDName是固定密钥。但是,location可以是可变的,应该返回的location将是与最大date相关联的one。

我最近的尝试当前仅返回所有日期中的最大日期,而不返回具有ID / Name对的最大日期的记录。例如:

代码语言:javascript
复制
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)

仅收益:

代码语言:javascript
复制
2,  Jake, Salem, 12/15/2018
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2016-11-19 14:44:38

方法1:

代码语言:javascript
复制
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]

方法二:

代码语言:javascript
复制
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

示例:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2016-11-19 14:23:35

类似这样的东西是有效的:

代码语言:javascript
复制
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()

票数 2
EN

Stack Overflow用户

发布于 2016-11-19 14:25:29

您可以通过按Id字段分组来查找最大日期。然后用主表join查找最终结果。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40689853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档