Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 server 在SQL Server中按记录Id和日期对分组数据排序_Sql Server - Fatal编程技术网

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寻求一个好的解决方案。但我用主键试过了。问题是最小值并不总是最早的。可能出现用户输入记录回溯的情况。因此,主键也不符合顺序。这就是为什么我没有在这里提到主键栏。我想我问这个问题时误导了你。尽管我想更改日期,但还有很多复杂的事情要做。我不可能解释整个情况。只要知道订购这些记录是必须的。