Sql tch只有9%和sort 24%。请指出我在为这个问题提出基于CTE的解决方案方面的不足之处。据我所知,当有非常巨大的数据时,CTE可能会变慢,并且会写入文件,因为内存不足。但在这里,一天一行似乎并没有这么大的数据。请您确认一下,这是否处理了一个事实,即价

Sql tch只有9%和sort 24%。请指出我在为这个问题提出基于CTE的解决方案方面的不足之处。据我所知,当有非常巨大的数据时,CTE可能会变慢,并且会写入文件,因为内存不足。但在这里,一天一行似乎并没有这么大的数据。请您确认一下,这是否处理了一个事实,即价,sql,sql-server,ssms,Sql,Sql Server,Ssms,tch只有9%和sort 24%。请指出我在为这个问题提出基于CTE的解决方案方面的不足之处。据我所知,当有非常巨大的数据时,CTE可能会变慢,并且会写入文件,因为内存不足。但在这里,一天一行似乎并没有这么大的数据。请您确认一下,这是否处理了一个事实,即价格可以发生在多个组中,例如3.5?我无法尝试,因为我的平台上没有行号()。此外,我现在还不能访问我的平台。@PerformanceDBA。试着运行它。它在多个组中出现的相同价格上肯定有效。你没有测试就否决了答案吗?测试我只是解释了我不能测试,以


tch只有9%和sort 24%。请指出我在为这个问题提出基于CTE的解决方案方面的不足之处。据我所知,当有非常巨大的数据时,CTE可能会变慢,并且会写入文件,因为内存不足。但在这里,一天一行似乎并没有这么大的数据。请您确认一下,这是否处理了一个事实,即价格可以发生在多个组中,例如3.5?我无法尝试,因为我的平台上没有
行号()。此外,我现在还不能访问我的平台。@PerformanceDBA。试着运行它。它在多个组中出现的相同价格上肯定有效。你没有测试就否决了答案吗?测试我只是解释了我不能测试,以及原因。这就是我问这个问题的原因。了解您的代码/平台,它具有记录归档系统的功能。尤其是“巧妙的把戏”。考虑到你的其他答案,我很确定它是有效的。投反对票!这似乎是SQL Server的最佳方法。我已经尝试了你的两个视图解决方案和我的基于CTE的解决方案,如下所示。您的两个视图解决方案直到4分钟才返回结果,然后我取消了查询。但CTE在18秒内返回了总共2989355行中的972762行。我比较了两种方案,在基于视图的解决方案中,哈希马赫(内部连接)的成本为79%,两次聚集索引扫描的成本为18%。在CTE中,哈希匹配只有9%,排序只有24%。请指出我在为这个问题提出基于CTE的解决方案方面的不足之处。据我所知,当有非常巨大的数据时,CTE可能会变慢,并且会写入文件,因为内存不足。但在这里,一天一行的数据似乎并没有这么大。我注意到的另一个问题是,两个视图解决方案的第一个起始日期是空的@阿尼尔库马尔。(a) 如果第一个FromDate为null,那么显然您没有使用我给出的代码。(b) 日期在这里是独一无二的。(c) 这对于DFANG来说“非常有效”,我在生产中有120多个这样的代码段,每天工作数百万次。(d) 众所周知,这种方法比CTE快得多,因为CTE具有巨大的资源成本,您似乎同意这一点。(e) 如果您有要检查的代码,我建议您打开一个新问题并发布所有代码(DDL和DML)。
Date    Price
1-Jan   3.2
2-Jan   3.2
3-Jan   3.2
4-Jan   3.2
5-Jan   3.2
6-Jan   3.2
7-Jan   3.2
8-Jan   3.2
9-Jan   3.5
10-Jan  3.5
11-Jan  3.5
12-Jan  3.5
13-Jan  3.5
14-Jan  4.2
15-Jan  4.2
16-Jan  4.2
17-Jan  3.2
18-Jan  3.2
19-Jan  3.2
20-Jan  3.2
21-Jan  3.2
22-Jan  3
23-Jan  3
24-Jan  3
25-Jan  3
26-Jan  3
27-Jan  3
28-Jan  3
29-Jan  3.5
30-Jan  3.5
31-Jan  3.5
Price   Date Range
3.2     1-8
3.5     9-13
4.2     14-16
3.2     17-22
3       22-28
3.5     29-31
declare @temptbl table (price decimal(18,2), mindate date, maxdate date)

declare @price as decimal(18,2), @date as date

declare tempcur cursor for 
select price, date
from YourTable

open tempcur

fetch next from tempcur
into @price, @date

while (@@fetch_status = 0)
begin
    if (isnull((select price from @temptbl where maxdate = (select max(maxdate)from @temptbl)),0) <> @price)
        insert into @temptbl (price,mindate,maxdate) values (@price,@date,@date)
    else
        update @temptbl
        set maxdate = @date
        where maxdate = (select max(maxdate)from @temptbl)


    fetch next from tempcur
    into @price, @date
end

deallocate tempcur

select price, convert(nvarchar(50), mindate) + ' to ' + convert(nvarchar(50), maxdate) as [date range] from @temptbl
select price, min(date), max(date)
from (select s.*,
             (row_number() over (order by date) - 
              row_number() over (partition by price order by date)
             ) as grp
      from sample s
     ) grp
group by grp, price;
WITH grouped AS (
SELECT 
Pricedate, price,
grp1= ROW_NUMBER() OVER (ORDER BY Pricedate) -
ROW_NUMBER() OVER (Partition by price ORDER BY Pricedate)
FROM yourTablewithDateAndPrice 
)
SELECT
  DtFrom = MIN(Pricedate),
  DtTo = MAX(Pricedate),
  Price = price

FROM grouped
GROUP BY Price,grp1 
order by DtFrom;
    CREATE VIEW MyTable_Base_V          -- Foundation View
    AS
        SELECT  Date,
                Date_Next,
                Price
            FROM (
            -- Derived Table: project rows with what we need
            SELECT  Date,
                    [Date_Next] = DATEADD( DD, 1, O.Date ),
                    Price,
                    [Price_Next] = (

                SELECT Price            -- NULL if not exists
                    FROM MyTable
                    WHERE Date = DATEADD( DD, 1, O.Date )
                    )

                FROM MyTable MT

                ) AS X
            WHERE Price != Price_Next   -- exclude unchanging rows
    GO

    CREATE VIEW MyTable_V               -- Requested View
    AS
        SELECT  [Date_From] = (
            --  Date of the previous row
            SELECT MAX( Date_Next )     -- previous row
                FROM MyTable_V
                WHERE Date_Next < MT.Date
                ),

                [Date_To] = Date,       -- this row
                Price
            FROM MyTable_Base_V MT
    GO

    SELECT  *
        FROM MyTable_V
    GO
    -- Derived Table: project rows with what we need
    SELECT  DateTime,
            [DateTime_Next] = (
            -- first row > this row
        SELECT  TOP 1
                DateTime                -- NULL if not exists
            FROM MyTable
            WHERE DateTime > MT.DateTime
            ),

            Price,
            [Price_Next] = (
            -- first row > this row
        SELECT  TOP 1
                Price                   -- NULL if not exists
            FROM MyTable
            WHERE DateTime > MT.DateTime
            )

        FROM MyTable MT