sql >> データベース >  >> RDS >> Sqlserver

まばらに入力されたデータベース テーブルから 1 日の 1 分あたりの行を生成する

    日付列にインデックスがあり、パフォーマンスが妥当であることを確認してください。

    SELECT t.Date,
    COUNT(*) AS Quantity,
    (SELECT COUNT(*) FROM Table WHERE Date < t.Date) AS RunningTotal
    FROM Table t
    GROUP BY t.Date
    

    次のように、テーブルに 1 分間に 1 行を入力することは、非常に迅速に行うことができます。

    DECLARE @StartDate smalldatetime
    DECLARE @EndDate smalldatetime
    
    SET @StartDate = '1 jan 2009' --MIN(TimeStamp) FROM Table
    SET @EndDate = '2 jan 2009' --MAX(TimeStamp) FROM Table
    
    SET @StartDate = DATEADD(minute,-DATEPART(minute,@StartDate),@StartDate)
    SET @EndDate = DATEADD(minute,-DATEPART(minute,@EndDate),@EndDate)
    
    
    ; WITH DateIntervalsCTE AS
    (
    SELECT 0 i, @startdate AS Date
    UNION ALL
    SELECT i + 1, DATEADD(minute, i, @startdate )
    FROM DateIntervalsCTE 
    WHERE DATEADD(minute, i, @startdate ) <= @enddate
    )
    SELECT DISTINCT Date FROM DateIntervalsCTE
    OPTION (MAXRECURSION 32767);
    

    再帰の制限により、<~ 22 日分のデータしか必要としない場合。

    必要なのは 2 つをマージすることだけです。一時テーブルを使用してデータを保持するのが最も速いようです

    DECLARE @StartDate smalldatetime
    DECLARE @EndDate smalldatetime
    DECLARE @t TABLE (Date smalldatetime,Quantity int,RunningTotal int)
    SET @StartDate = '1 jan 2009' --MIN(TimeStamp) FROM Table
    SET @EndDate = '2 jan 2009' --MAX(TimeStamp) FROM Table
    
    SET @StartDate = DATEADD(minute,-DATEPART(minute,@StartDate),@StartDate)
    SET @EndDate = DATEADD(minute,-DATEPART(minute,@EndDate),@EndDate)
    
    
    ; WITH DateIntervalsCTE AS
    (
    SELECT 0 i, @startdate AS Date
    UNION ALL
    SELECT i + 1, DATEADD(minute, i, @startdate )
    FROM DateIntervalsCTE 
    WHERE DATEADD(minute, i, @startdate ) <= @enddate
    )
    INSERT INTO @t (Date) 
    SELECT DISTINCT Date FROM DateIntervalsCTE
    OPTION (MAXRECURSION 32767);
    
    UPDATE t SET Quantity = (SELECT COUNT(d.TimeStamp) FROM Table d WHERE Date = t.date)
    from @t t
    
    update t2 set runningtotal = (SELECT SUM(Quantity) FROM @t WHERE date <= t2.date)
    from @t t2
    
    select * from @t
    


    1. データベースで継承を効果的にモデル化するにはどうすればよいですか?

    2. 左結合を使用するときに複合インデックスをオンにすることはできますか

    3. MySQLJDBC08001データベース接続エラーを修正する方法

    4. エラー-ORA-22835:バッファが小さすぎてCLOBからCHARまたはBLOBからRAWに変換できません