SQL 语句,用于查找项目的类型、包含状态以及最近添加的项目
Posted
技术标签:
【中文标题】SQL 语句,用于查找项目的类型、包含状态以及最近添加的项目【英文标题】:SQL statement to to find where items are of a type, contain a status, and are the most recent addition 【发布时间】:2013-07-22 19:28:52 【问题描述】:这应该很简单,但我无法弄清楚这一点。我需要获取一行数据,其中该行中的字段是该列的最大值,并且已在该行上设置了特定状态,该行已按值过滤。
这是一个表格示例:
ID Date Entered Item Status
1 1/1/2012 Joe Ready
2 1/2/2012 Joe Ready
3 1/1/2012 Sam Ready
4 1/2/2012 Sam Not Ready
5 1/2/2012 Sam Ready
6 1/1/2013 Jimmy Not Ready
我要取回的结果集是:
ID Date Entered Item Status
2 1/2/2012 Joe Ready
5 1/2/2012 Sam Ready
这是我迄今为止的许多失败尝试之一:
Select id, max(Date_Entered), Item
from table1
where status = 'Ready'
Group by Item, id
这会返回太多重复项
Select max(Date_Entered), RELEASE_GROUP_C
from table1
where status = 'Ready'
Group by item
这不会返回 ID。
【问题讨论】:
什么数据库服务器?甲骨文、SQL Server、mysql? 我正在使用 SQL-Server 进行查询。 【参考方案1】:您可以为此使用ROW_NUMBER()
函数:
SELECT ID, [Date Entered], Item, Status
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY Item ORDER BY [Date Entered] DESC)'RowRank'
FROM Table1
WHERE Status = 'Ready'
)sub
WHERE RowRank = 1
演示:SQL Fiddle
ROW_NUMBER()
函数为 PARTITION BY
部分中定义的每个分组分配一个从 1 开始的数字,并且基于 ORDER BY
部分的顺序,在这种情况下,对于每个 Item
,它将开始最新/最新日期编号为 1。
【讨论】:
感谢这是一个很棒的解决方案。【参考方案2】:像这样?
SELECT ID, Date_Entered, Item, Status
FROM t1
WHERE
Status = 'Ready'
AND
t1.Date_Entered = (SELECT MAX(Date_Entered) FROM t1)
【讨论】:
我假设他不仅想要所有行的最大日期,还想要每个项目组的最大日期,正如 Goat CO 所说的,下面的窗口功能。这只是一个假设,因为 OP 不清楚【参考方案3】:with CTE_TEMP as
(
select
*,
row_number() over (partition by Item order by Date desc, ID desc) as row_num
from temp
where Status = 'Ready'
)
select *
from CTE_TEMP
where row_num = 1
SQL FIDDLE EXAMPLE
【讨论】:
以上是关于SQL 语句,用于查找项目的类型、包含状态以及最近添加的项目的主要内容,如果未能解决你的问题,请参考以下文章