按SQL Server中的记录ID和日期对数据进行排序

时间:2016-09-13 16:22:23

标签: sql-server

假设我有一个如下所示的数据集。我想确定StyleId更改的日期。由于数据集的顺序不正确,我的观察结果出错了。

例如,应该只有1个更改(在2016-04-07样式ID从530更改为526)但根据当前顺序,它显示样式ID在07日从530更改为526,再次在同一天从526到530,最后在19日,它从530变为526.请指导我以正确的方式订购此数据集。

Data set

更新

中使用DESC
SELECT * 
FROM SewingPlan 
ORDER BY SewingDate, StyleId DESC

不是有效的解决方案,因为它不适用于所有方案。

UPDATE2:

我已经发布了一个解决方案作为我想出的答案。谁有更好的解决方案?

2 个答案:

答案 0 :(得分:0)

解决方案&假设: SewingPlan表有一个主键。它是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

答案 1 :(得分:0)

我尝试使用游标并获得了所需的输出(没有其他列)。这可能是一种完成它的肮脏方式。发布查询以供将来参考。欢迎提供更优化和更好的解决方案。

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 

Ordered Data Set