假设我有一个如下所示的数据集。我想确定StyleId
更改的日期。由于数据集的顺序不正确,我的观察结果出错了。
例如,应该只有1个更改(在2016-04-07样式ID从530更改为526)但根据当前顺序,它显示样式ID在07日从530更改为526,再次在同一天从526到530,最后在19日,它从530变为526.请指导我以正确的方式订购此数据集。
更新
在
中使用DESC
SELECT *
FROM SewingPlan
ORDER BY SewingDate, StyleId DESC
不是有效的解决方案,因为它不适用于所有方案。
UPDATE2:
我已经发布了一个解决方案作为我想出的答案。谁有更好的解决方案?
答案 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