Sql server 在SQL Server中按记录Id和日期对分组数据排序
假设我有一个如下的数据集。我想确定Sql server 在SQL Server中按记录Id和日期对分组数据排序,sql-server,Sql Server,假设我有一个如下的数据集。我想确定StyleId更改的日期。由于数据集的顺序不正确,我的观察结果出错了 例如,应该只有一个更改(2016-04-07样式Id从530更改为526),但根据当前顺序,它显示样式Id在07日从530更改为526,在同一天再次从526更改为530,最后在19日从530更改为526。请指导我以正确的方式订购此数据集 更新: 在中使用DESC SELECT * FROM SewingPlan ORDER BY SewingDate, StyleId DESC 不是有
StyleId
更改的日期。由于数据集的顺序不正确,我的观察结果出错了
例如,应该只有一个更改(2016-04-07样式Id从530更改为526),但根据当前顺序,它显示样式Id在07日从530更改为526,在同一天再次从526更改为530,最后在19日从530更改为526。请指导我以正确的方式订购此数据集
更新:
在中使用DESC
SELECT *
FROM SewingPlan
ORDER BY SewingDate, StyleId DESC
不是有效的解决方案,因为它不适用于所有场景
更新2:
我已经发布了一个解决方案作为我的答案。有谁有更好的解决方案吗?解决方案和假设:SewingPlan表有一个主键。它是缝合计划ID。它会一个接一个地自动增加。所以最小值应该是最早的值
此查询将返回更改的主键
SELECT MIN(SewingPlan_ID) FROM SewingPlan Group BY StyleId
假设你得到了1000作为一个styleId的答案。之后,您可以查询您现在知道的主键。您可以连接或嵌套查询任何内容
SELECT * FROM SewingPlan where SewingPlan_ID=1000
让我知道你的反应
更新:
您还可以使用:轻松获取styleId的更改日期
SELECT MIN(SewingDate) FROM SewingPlan Group BY StyleId
我尝试使用游标并获得了所需的输出(没有额外的列)。这可能是一种肮脏的方式。发布查询以供将来参考。欢迎提供更优化、更好的解决方案
DECLARE @id int, @SewingDate datetime, @StyleId int,@PreviousStyleId int
SELECT TOP 1 @PreviousStyleId = StyleId
FROM SewingPlan
ORDER BY SewingDate,StyleId
IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL DROP Table #TempTable
CREATE TABLE #TempTable(SewingDate DATETIME,StyleId INT,Sequence INT)
DECLARE sewingdates
CURSOR FOR
SELECT SewingDate
FROM SewingPlan
GROUP BY SewingDate
ORDER BY SewingDate
OPEN sewingdates
FETCH NEXT
FROM sewingdates
INTO @SewingDate
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #TempTable (SewingDate, StyleId, Sequence)
SELECT SewingDate,StyleId,ROW_NUMBER() OVER (ORDER BY (CASE WHEN StyleId = @PreviousStyleId THEN '1' ELSE StyleId END))
FROM SewingPlan
WHERE SewingDate = @SewingDate
SELECT TOP 1 @PreviousStyleId = StyleId
FROM SewingPlan
WHERE SewingDate = @SewingDate
ORDER BY (CASE WHEN StyleId = @PreviousStyleId THEN '1' ELSE StyleId END) DESC
FETCH NEXT
FROM sewingdates
INTO @SewingDate
END
CLOSE sewingdates
DEALLOCATE sewingdates
SELECT * FROM #TempTable
GO
您能否提供示例代码/查询,而不是数据集的屏幕截图?你试过什么?你还有其他的专栏吗。插入这些记录的原因是什么?逻辑是什么?这么多问题…谢谢你的回复。查询是一个复杂的查询。。很难让它简单到可以在这里发布。但是,这可以作为我需要订购的最终结果数据集。如何从“选择”开始,从“按缝合日期从缝合计划顺序中选择”,从“按缝合日期从缝合计划顺序中选择”,从“按缝合日期从缝合计划顺序中选择”,从“按缝合日期从缝合计划顺序中选择,从缝合日期从缝合计划顺序中选择”,从“样式ID”开始,仅检索上述顺序中的数据集,只是想尝试在不增加列的情况下实现预期结果。(主要是因为其他列在排序中没有用处。)我不会插入这些记录。它们已经存在于数据库中。我需要对它们重新排序以跟踪变化Hanks Sanka寻求一个好的解决方案。但我用主键试过了。问题是最小值并不总是最早的。可能出现用户输入记录回溯的情况。因此,主键也不符合顺序。这就是为什么我没有在这里提到主键栏。我想我问这个问题时误导了你。尽管我想更改日期,但还有很多复杂的事情要做。我不可能解释整个情况。只要知道订购这些记录是必须的。