2012-02-08 64 views
1

我是堆棧溢出的粉絲,但我遇到了一個我尚未發現的問題,需要一些專家幫助。 我有一個查詢按時間順序與日期時間複合鍵(唯一的,從未刪除)和多個數據片斷。我想知道的是,如果有辦法找到值變化的區域的開始(或結束)? I.E.在已排序的MS Access查詢中查找連續區域

DateTime someVal1 someVal2 someVal3 target 

  1. 1 3 4甲
  2. 1 2 4阿
  3. 1 3 4甲
  4. 1 2 4 B
  5. 1 2 5乙
  6. 1 2 5 A

和我的查詢返回第1,4和6行。它發現第5列從A到B,然後從B回到A的變化?我已經嘗試了查找重複方法,並在total屬性中使用min和max,但是它給了我第一個和最後一個整體,而不是本地max和min?任何類似的問題?

回答

1

我沒有看到的someVal1,someVal2和someVal3字段的任何目的,所以我離開了出來。我使用自動編號作爲主鍵而不是日期/時間字段;但是這種方法也應該適用於你的日期/時間主鍵。這是我的表格版本中的數據。

pkey_field target 
1   A 
2   A 
3   A 
4   B 
5   B 
6   A 

我用一個相關子查詢發現每一行的前面pkey_field值。

SELECT 
    m.pkey_field, 
    m.target, 
    (SELECT Max(pkey_field) 
     FROM YourTable 
     WHERE pkey_field < m.pkey_field) 
    AS prev_pkey_field 
FROM YourTable AS m; 

然後把它放在我加入基表的另一個副本的子查詢中。

SELECT 
    sub.pkey_field, 
    sub.target, 
    sub.prev_pkey_field, 
    prev.target AS prev_target 
FROM 
    (SELECT 
     m.pkey_field, 
     m.target, 
     (SELECT Max(pkey_field) 
      FROM YourTable 
      WHERE pkey_field < m.pkey_field) 
     AS prev_pkey_field 
    FROM YourTable AS m) AS sub 
    LEFT JOIN YourTable AS prev 
    ON sub.prev_pkey_field = prev.pkey_field 
WHERE 
    sub.prev_pkey_field Is Null 
    OR prev.target <> sub.target; 

這是最終查詢的輸出。

pkey_field target prev_pkey_field prev_target 
1   A 
4   B  3    A 
6   A  5    B 
+0

AHHHHHH!這很聰明!我仍然在着手處理子查詢的權力,但這個是一個非常輝煌和清晰的回答,我希望我有更多的信譽給予好評輸入。 – MMerry 2012-02-09 03:14:09

+0

這兩頁來自你的同胞可能會幫助你提高抓地力。 :-) http://allenbrowne.com/subquery-01.html和http://allenbrowne.com/subquery-02.html – HansUp 2012-02-09 03:20:41

+0

哈哈哈!我已經有了這兩頁,我正在瘋狂地傾注他們。只是另一個簡單的問題,這對於固定表格非常適用,但我如何修改此代碼以用於查詢?這將允許表單靈活地選擇日期範圍? – MMerry 2012-02-09 03:46:39

0

這是第一次嘗試,

SELECT t1.Row, t1.target 
FROM t1 WHERE (((t1.target)<>NZ((SELECT TOP 1 t2.target FROM t1 AS t2 WHERE t2.DateTimeId<t1.DateTimeId ORDER BY t2.DateTimeId DESC),"X")));