簡體   English   中英

比較和分組行SQL結果POSTGRES

[英]Compare and group rows SQL result POSTGRES

我有一個表格,其中列出了每個事件代表一個寄存器的列表,我必須將同一天發生的寄存器分組。 另外,我必須將當天的事件分組,按id_fertilizer和calibrado分組 ,但是我不能將第一個結果與最后一個結果進行分組

我的SQL結果是這樣的:

    work_date     id_fertilizer calibrado area   begin_date    end_date
[1] '2014-07-22'  43            NULL      0      "07:03:42.0"  "07:08:00.0"
[2] '2014-07-22'  49            NULL      0      "07:08:52.0"  "07:44:04.0"
[3] '2014-07-22'  49            true      54101  "07:49:41.0"  "12:00:05.0"
[4] '2014-07-22'  49            true      4893   "12:00:30.0"  "14:06:13.0"
[5] '2014-07-22'  43            NULL      0      "14:06:51.0"  "14:49:30.0"
[6] '2014-07-22'  43            NULL      12397  "14:50:04.0"  "16:12:03"

我必須在一行中將第3行和第4行以及在另一行中將第5行和第6行分組,將min() begin_date和max() end_date和sum() 用作 區域
第1和2行是獨立的行。 最后,我必須有4行:1、2,(3 + 4),(5 + 6)

我得到的結果是這樣的(使用函數窗口),但這是錯誤的,因為它已將行1、5、6分組為一行:

work_date                id_fertilizer  calibrado  area  begin_date    end_date
"2014-07-22 00:00:00.0"  43             NULL       1     "07:03:42.0"  "16:12:03.0"
"2014-07-22 00:00:00.0"  49             NULL       0     "07:08:52.0"  "07:44:04.0"
"2014-07-22 00:00:00.0"  49             true       5     "07:49:41.0"  "14:06:13.0"

我的結果是,用3行話說,這些家伙從id:fertilizer 43的工作時間是07:03:42到16:12:03,但是還說他是從id_fertilizer 49的工作時間是07:08:52 07:44:04開始的。從某種意義上說,我必須尊重事件的時間順序。 所以,我期望的結果是這樣的:

      work_date     id_fertilizer  calibrado  area    begin_date    end_date
[1]   '2014-07-22'  43             NULL       0       "07:03:42.0"  "07:08:00.0"
[2]   '2014-07-22'  49             NULL       0       "07:08:52.0"  "07:44:04.0"
[3]   '2014-07-22'  49             true       58994   "07:49:41.0"  "14:06:13.0"
[4]   '2014-07-22'  43             NULL       12397   "14:06:51.0"  "16:12:03"

有根據的猜測:

SELECT work_date, id_fertilizer, calibrado
     , sum(area)       AS area
     , min(begin_date) AS begin_date
     , max(end_date)   AS end_date
FROM  (
   SELECT *
     , count(step) OVER (ORDER BY work_date, id_fertilizer, begin_date) AS grp
   FROM  (
      SELECT *
           , lag(calibrado) OVER (ORDER BY work_date, id_fertilizer, begin_date)
             IS DISTINCT FROM calibrado AS step
      FROM   tbl
      ) sub1
   ) sub2
GROUP  BY work_date, id_fertilizer, calibrado, grp
ORDER  BY work_date, id_fertilizer, calibrado, grp;

這將產生您的更新結果。

相關答案以及更多說明:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM