1

ランレングスエンコーディングを使用して圧縮したい、値と日付の巨大なテーブルがいくつかあります。これを行う最も明白な方法 (私にとって) は、すべての個別の値の組み合わせと、最小日付と最大日付を選択することです。これの問題は、マッピングが停止してから再開するインスタンスを見逃すことです。

Id | Value1 | Value2 | Value3 |  DataDate
------------------------------------------
01 |   1    |   2    |   3    | 2000-01-01
01 |   1    |   2    |   3    | 2000-01-02
01 |   1    |   2    |   3    | 2000-01-03
01 |   1    |   2    |   3    | 2000-01-04
01 |   A    |   B    |   C    | 2000-01-05
01 |   A    |   B    |   C    | 2000-01-06
01 |   1    |   2    |   3    | 2000-01-07

このようにエンコードされます

Id | Value1 | Value2 | Value3 |  FromDate |  ToDate
-----------------------------------------------------
01 |   1    |   2    |    3   | 2000-01-01| 2000-01-07
01 |   A    |   B    |    C   | 2000-01-05| 2000-01-06

これは明らかに間違っています。

私が望むのは、一連の値ごとに存在する連続した日付の各セットを返すクエリです。

あるいは、このお尻を後ろ向きに見ている場合は、他のアドバイスをいただければ幸いです。

4

3 に答える 3

2

これを試して:

DECLARE @MyTable TABLE (
    Id INT,
    Value1 VARCHAR(10), 
    Value2 VARCHAR(10),
    Value3 VARCHAR(10), 
    DataDate DATE
);

INSERT @MyTable 
SELECT 01, '1', ' 2', '3', '2000-01-01' UNION ALL
SELECT 01, '1', ' 2', '3', '2000-01-02' UNION ALL
SELECT 01, '1', ' 2', '3', '2000-01-03' UNION ALL
SELECT 01, '1', ' 2', '3', '2000-01-04' UNION ALL
SELECT 01, 'A', ' B', 'C', '2000-01-05' UNION ALL
SELECT 01, 'A', ' B', 'C', '2000-01-06' UNION ALL
SELECT 01, '1', ' 2', '3', '2000-01-07'

SELECT  Id, Value1, Value2, Value3,
        MIN(DataDate) AS FromDate, MAX(DataDate) AS ToDate
FROM (
    SELECT  x.Id, x.Value1, x.Value2, x.Value3, 
            x.DataDate,
            GroupNum = 
                DATEDIFF(DAY, 0, x.DataDate) -
                ROW_NUMBER() OVER(PARTITION BY x.Id, x.Value1, x.Value2, x.Value3 ORDER BY x.DataDate)
    FROM    @MyTable x
) y
GROUP BY Id, Value1, Value2, Value3, GroupNum

結果:

Id Value1 Value2 Value3 FromDate   ToDate
-- ------ ------ ------ ---------- ----------
1  1       2     3      2000-01-01 2000-01-04
1  1       2     3      2000-01-07 2000-01-07
1  A       B     C      2000-01-05 2000-01-06
于 2014-07-06T08:44:22.537 に答える
0

これを試して:

SELECT  Id, Value1, Value2, Value3, MIN(DataDate) AS FromDate, MAX(DataDate) AS ToDate
FROM YourTable
GROUP BY Id, Value1, Value2, Value3
于 2014-07-06T03:49:35.050 に答える