我有一個這種格式的表格:
| 用戶 | 時間 | 地位 |
|---|---|---|
| 用戶 1 | 2021-12-24 14:00:00 | 連接 |
| 用戶 2 | 2021-12-24 14:05:23 | 連接 |
| 用戶 2 | 2021-12-24 14:10:11 | 斷開 |
| 用戶 2 | 2021-12-24 14:10:17 | 連接 |
| 用戶 1 | 2021-12-24 19:35:22 | 斷開 |
| 用戶 2 | 2021-12-25 01:10:40 | 斷開 |
我想要一個表,其中連接和斷開連接作為列,每個用戶從連接到下一次斷開連接的每個會話一行
| 用戶 | 連接 | 斷開 |
|---|---|---|
| 用戶 1 | 2021-12-24 14:00:00 | 2021-12-24 19:35:22 |
| 用戶 2 | 2021-12-24 14:05:23 | 2021-12-24 14:10:11 |
| 用戶 2 | 2021-12-24 14:10:17 | 2021-12-25 01:10:40 |
我可以在 MySQL、MariaDB 或 MSSQL 上創建它,具體取決于哪里更容易做到。是否可以作為視圖來做?很棒的插件,但并非絕對必要:“持續時間”列顯示從連接到斷開連接的每個會話的持續時間。
如果更簡單,從 1970 年 1 月 1 日開始,連接/斷開連接時間可能是(mili)秒。
uj5u.com熱心網友回復:
嘗試以下解決方案,它應該適用于大多數 RDBMS,注意正確分隔與保留字沖突的列名。
首先,您需要配對連接/斷開連接,這可以通過對行進行編號,然后使用模數復制每隔一個數字,然后使用條件聚合來完成:
with rn as (
select *,
Row_Number() over(partition by user order by time) rn
from t
), gp as (
select *,
case when rn %2=0 then
Lag(rn) over(partition by user order by rn)
else rn end gp
from rn
)
select
[user],
Max(case when status = 'connect' then time end) Connect,
Max(case when status = 'disconnect' then time end) Disconnect
from gp
group by user, gp
uj5u.com熱心網友回復:
在有條件的聚集可以在應用后才能使用ROW_NUMBER()視窗功能,如果您的可用資料庫版本8.0或更高版本,10.2 和2005年進行的MySQL,MariaDB的和SQL服務器分別如
WITH t2 AS
(
SELECT ROW_NUMBER() OVER (PARTITION BY user,status ORDER BY time) AS rn,
t.*
FROM t
)
SELECT User,
MAX(CASE WHEN status = 'connect' THEN time END) AS connect,
MAX(CASE WHEN status = 'disconnect' THEN time END) AS disconnect
FROM t2
GROUP BY user, rn
ORDER BY user, rn
在哪里
該資料集是由分組
user和status列,同時排序time列user,這是一個保留關鍵字,必須替換[user]為SQL Server DB的列名
Demo for MySQL/MariaDB
Demo for SQL Server
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/399495.html
