iT邦幫忙

0

[SQL] 請教如何將開始及結束時間合併成一筆 Record

我使用 MariaDB 儲存了 Log,希望可以使用 SQL 語法撈出並合併開始跟結束的時間

來源 Log 表如下

+------+-------+------------------+---------------------+
| No   |ID     | Serial_Number    | Time                |
+------+-------+------------------+---------------------+
|  719 |   193 | A000000000000001 | 2018-01-08 13:57:08 |
|  720 |   195 | A000000000000001 | 2018-01-08 13:57:09 |
|  721 |   196 | A000000000000001 | 2018-01-08 13:57:15 |
|  722 |   195 | A000000000000001 | 2018-01-08 13:57:18 |
|  723 |   196 | A000000000000001 | 2018-01-08 13:57:18 |
|  724 |   195 | A000000000000001 | 2018-01-08 13:57:21 |
|  725 |   196 | A000000000000001 | 2018-01-08 13:57:22 |
|  726 |   193 | A000000000000002 | 2018-01-08 13:57:24 |
|  727 |   195 | A000000000000001 | 2018-01-08 13:57:25 |
|  728 |   196 | A000000000000001 | 2018-01-08 13:57:27 |
|  729 |   195 | A000000000000002 | 2018-01-08 13:57:28 |
|  730 |   196 | A000000000000002 | 2018-01-08 13:57:30 |
|  731 |   195 | A000000000000002 | 2018-01-08 13:57:31 |
|  732 |   196 | A000000000000002 | 2018-01-08 13:57:33 |
|  733 |   197 | A000000000000001 | 2018-01-08 13:57:34 |
|  734 |   195 | A000000000000002 | 2018-01-08 13:57:36 |
|  735 |   196 | A000000000000002 | 2018-01-08 13:57:37 |
|  736 |   197 | A000000000000002 | 2018-01-08 13:57:39 |
+------+-------+------------------+---------------------+

No 為流水號
ID 193 為登入系統、195為 Request 檔案、196 為 Download 檔案、197 為登出系統
Serial_Number 為序號
Time 時間

希望可以產出如下面的結果,再請各位先進指教,謝謝

+------------------+---------------------+---------------------+
| Serial_Number    | Start_Time          | End_Time            |
+------------------+---------------------+---------------------+
| A000000000000001 | 2018-01-08 13:57:08 | 2018-01-08 13:57:34 |
| A000000000000002 | 2018-01-08 13:57:24 | 2018-01-08 13:57:39 |
+------------------+---------------------+---------------------+
2
跑跑貓力歐
iT邦新手 5 級 ‧ 2018-01-09 08:45:05
最佳解答

如果是要取得同一Serial Number的Start & End Time,用Group by組合就可以了。
登入系統時間必為最小時間,登出系統時間必為最大時間,應該不需要ID欄位作判斷條件。

SELECT Serial_Number, MIN(Time) AS Start_Time, MAX(Time) AS End_Time
FROM your_table
GROUP BY Serial_Number;
haoming iT邦好手 1 級 ‧ 2018-01-09 09:28:56 檢舉

用 sqlfiddle 比較執行時間,這方法真的比較快,謝謝你。

** 我的方法
http://sqlfiddle.com/#!9/edebca/1

** 您的方法
http://sqlfiddle.com/#!9/0a1da8/1

jerry00218 iT邦研究生 2 級 ‧ 2018-01-09 23:42:53 檢舉

Haoming 及 zdey 的方法我第一次看到,到今天才知道同一個表可以用兩次,跑跑大的方法也很新鮮,長知識了 XDD

感謝各位大大的鼎力相助,耗時耗腦解惑我的問題。
謝謝!!

1
haoming
iT邦好手 1 級 ‧ 2018-01-09 08:42:36
select loga.serial_no , loga.timetxt as Start_Time , logb.timetxt as End_Time   
from log loga,log logb
where loga.serial_no = logb.serial_no
and loga.id=193
and logb.id=197

執行結果參考這裡
http://tpcg.io/gmshXA

0
zdey
iT邦新手 5 級 ‧ 2018-01-09 17:14:03

我的話還是會選擇ID來判斷,不喜歡MAX跟MIN~(個人偏好)。
另外想請問haoming怎麼比較執行時間阿,他都跳來跳去的XD
想看看join會不會比較快。

select loga.serial_no , loga.timetxt as Start_Time , logb.timetxt as End_Time   
from log loga join log logb on loga.serial_no = logb.serial_no
where loga.id=193 and logb.id=197
haoming iT邦好手 1 級 ‧ 2018-01-10 08:42:13 檢舉

sqlfiddle 最下方有執行時間可以看

我要發表回答

立即登入回答