Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在类别列中选择具有相同类别的记录子集(n=1)_Sql_Sql Server_Sql Server 2014 - Fatal编程技术网

Sql 在类别列中选择具有相同类别的记录子集(n=1)

Sql 在类别列中选择具有相同类别的记录子集(n=1),sql,sql-server,sql-server-2014,Sql,Sql Server,Sql Server 2014,在过去的几天里,我一直在学习如何执行查询。我想从一个表中进行选择,如类别首先更改其状态的记录下方的表 Id Category Month 1 Start Jan 2 Start Feb 3 Middle Mar 4 Middle Apr 5 End May 从该表中,我只需要类别发生更改的记录。因此,我希望SELECT中的表如下所示: Id Category Month

在过去的几天里,我一直在学习如何执行查询。我想从一个表中进行选择,如类别首先更改其状态的记录下方的表

Id    Category   Month

1      Start      Jan
2      Start      Feb
3      Middle     Mar
4      Middle     Apr
5      End        May  
从该表中,我只需要类别发生更改的记录。因此,我希望SELECT中的表如下所示:

Id    Category   Month

1      Start      Jan
3      Middle     Mar
5      End        May  

提前感谢您抽出时间回答我的问题。

如果我理解正确,可以使用
分组方式来实现您的目标

SELECT MIN(id) as ID, Category, MIN(Month) as Month
FROM MyTable
GROUP BY Category

提取每个类别的最小id,并获取该记录的月份:

select 
  t1.id, t1.category, t2.month
from (
  select category, min(id) as id
  from yourtable
  group by category
  ) t1
join t2 on t1.id = t2.id and t1.category = t2.category -- second may not be necessary
如果您的
id
列是唯一的,则不需要使用
category
的条件。
上述代码将从
month
列中获取每个类别的最小id值。

我认为这很接近,但MIN(month)可能并不总是如此。也许。取而代之的是Min(id),IN子句可能只为category提取最早的行(每个id假设其自动递增),但是考虑到OP的问题,听起来可能是按时间顺序的。鉴于该规范,我不确定是否需要更复杂的查询。我会等着看情况是否如此。非常感谢。是的,桑蒂,这就是我想做的。你好。看来我很快就和他谈过了。尽管桑蒂的回答非常有用,但他的解决方案中存在一个问题(至少对我的桌子而言)。让我解释一下我的新问题。类别是指产品的状态。对于大多数产品,代码工作正常。不幸的是,有些产品的目录是迭代的。所以它可能是(1)开始-(2)中间-(3)开始-(4)中间-(5)中间-(6)结束。我正在搜索一种语法,该语法允许我捕获所有更改,因此它将返回记录(1)开始-(2)中间-(3)开始-(4)中间-(6)结束。谢谢你的额外评论:我正在使用SQL Server 2014