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 语句,用于查找项目的类型、包含状态以及最近添加的项目的主要内容,如果未能解决你的问题,请参考以下文章

sql语句中怎样将字符类型转换成数字类型

SQL CREATE INDEX 语句

SQL CREATE INDEX 语句:如何创建索引?

sql语句中如何将字符类型转换成数字类型?

MySQL insert语句锁分析

数据库学习之二--SQL语句以及数据类型