2015-12-31 37 views
0

假設下列數據:解析功能 - 使用LAG()比較值

| Col1 | Col2  | 
| 3  | 20-dec-15 | 
| 4  | 20-dec-15 | 
| 8  | 25-dec-15 | 
|10  | 25-dec-15 | 

我不得不Col1列的值進行比較的特定日期。

例如:20-DEC-15的變化發生在3改變爲4。

我必須解決這個使用分析功能。

下面是我使用

decode(LAG(Col1,1,Col1) OVER (partition by Col2 order by Col2),Col1,0,1) Changes 

由於Col2是日期列,分區通過日期不爲我工作的查詢。我們可以將日期列作爲分區嗎?

預期結果應該是:

| Changes | 
| 0  | 
| 1  | 
| 0  | 
| 1  | 

這裏1表示在比較了同一日期發生更改。

回答

1

你需要以部分時間重置爲00:00:00使用trunc(),但你還是應該保持order by col2,這樣在同一天的所有行被部分時間排序:

我也喜歡一個明確case這種比較,我個人覺得decode()真的很難看:

select case 
     when col1 = lag(col1,1,col1) over (partition by trunc(col2) order by col2) then 0 
     else 1 
     end as changes 
from the_table; 
+0

我試着to_date(col2),這似乎是工作。 –

+0

@subi_speedrunner:'to_date()'將**'varchar' **值轉換爲'date'值。不要***在定義爲「日期」的列上使用它。它會首先隱式地將'date'轉換成'varchar',然後將它轉換回到它開頭的'date'。 –

+0

感謝這個信息。我將確保不要在日期字段中使用'to_date()'。 –