SQL Server 2005 группировки значений, отображать только изменения - PullRequest
0 голосов
/ 08 марта 2012

Опубликуйте это снова, так как я сделал несколько обновлений.

Я пытаюсь сгруппировать набор значений, но я хочу отображать значения только в том случае, если произошли изменения.

Представьте, что значение колеблется в диапазоне от 1 до 4, до 3, до 1, до 1 и до 1.

Некоторые примеры данных

value | date_loaded | 
  1   |  2012-03-07 |
  1   |  2012-03-06 |
  1   |  2012-03-05 |
  3   |  2012-03-04 |
  4   |  2012-03-03 |
  1   |  2012-03-02 |

Я хочу отобразить каждое из значений в порядке их изменения, но сгруппировать их вместе. Таким образом, вы увидите только по порядку, 1, 4, 3, 1, а не по трем 1 в последний раз.

Итак, я хотел бы отобразить самое последнее значение с самой ранней датой, например,

value | date_loaded | 
  1   |  2012-03-05 |
  3   |  2012-03-04 |
  4   |  2012-03-03 |
  1   |  2012-03-02 |

Как лучше всего это сделать? Можно ли сделать заявление if? Если значение 1 отличается от значения 2, +1 «изменить»? Поэтому я мог бы сгруппировать значения по «change1», «change2» и т. Д .?

Ответы [ 3 ]

1 голос
/ 08 марта 2012

Это решение довольно сложное, но может помочь. К сожалению, мне не хватает всего кода, но вот концептуальный подход для начинающих:

Сначала вы выбираете временную таблицу, в которую входит row_counter. Примерно так:

(SELECT value, date_loaded, row_number() over (partition by date_loaded) as rowNum FROM yourTable) as tempTable1

Затем используйте какой-то цикл while, который выполняет итерацию в зависимости от количества строк (tempTableCount), которое имеется в таблице temp (tempTable1). Этот цикл будет перебирать эту временную таблицу по одной строке за раз и вставлять строку в новую временную таблицу. После каждой вставки вы отслеживаете предыдущее вставленное значение и увеличиваете счетчик строк. Если значение изменяется, тогда вставьте, иначе продолжайте в цикле.

Мой синтаксис, вероятно, очень далек (извините, не на компьютере с sql на нем), но концептуально:

WHILE loopRowCount <= tempTableCount
BEGIN

IF(@previousValue <> (SELECT value from tempTable WHERE rowNum = loopRowCount))
BEGIN
    INSERT INTO tempTable2
    (value, date_loaded)
        (SELECT value, date_loaded FROM tempTable WHERE rowNum = loopRowCount)
END

set @previousValue = (SELECT value FROM tempTable WHERE rowNum = loopRowCount)
loopRowCount = loopRowCount + 1
END

Ваша таблица tempTable2 будет содержать желаемый результат, при условии, что вы переживете синтаксическую ошибку. Я постараюсь почистить его утром, но это лучшее, что я получил за вечер! Наслаждайтесь! XD

1 голос
/ 08 марта 2012

Как насчет:

;WITH data AS
(
SELECT 1 as [value],'2012-03-07' as date
UNION ALL SELECT 1,'2012-03-06'
UNION ALL SELECT 1,'2012-03-05'
UNION ALL SELECT 3,'2012-03-04'
UNION ALL SELECT 4,'2012-03-03'
UNION ALL SELECT 1,'2012-03-02'
)
,data2 AS
(
SELECT 
[Value]
,date
,row_number() OVER (ORDER BY (SELECT NULL)) as row1
FROM data
)
,data3 AS
(
SELECT * 
, row1 - row_number() OVER (ORDER BY [Value]) as row2
from data2
)
SELECT 
MIN([Value]) AS [Value]
,MIN(Date) as Date
FROM data3
GROUP BY [Value] - row2
ORDER BY MIN(row1)
1 голос
/ 08 марта 2012
SELECT VALUE,MIN(date_loaded)
FROM  YOURTABLE
GROUP BY VALUE;
...