SQL Groupby UserID 取首尾重复
SQL Query Groupby UserID and take the first and last for duplicates
您好,我正在尝试对 table 上的某些元素进行 select。这是我的 table 的样子 Time、UsrerId、Data。现在我想做的是针对相同的用户 ID,我希望根据时间戳获得数据的第一个和最后一个值。
示例:
Time UserID Data
8 PM 1 200
9 PM 1 300
10 PM 1 100
8 PM 2 150
9 PM 2 250
10 PM 2 350
8 PM 3 100
所以我的结果应该是这样的:
1 200 100
2 150 350
3 100 100
找到每个 userid
的 min
和 max
时间
然后 Join
主 table 的结果与 userid
和 min time
得到每个 userid
[=24 的 min
数据=]
然后再次将结果与 main table 与 userid
和 max time
相结合,以获得每个 userid
的 max
数据
试试这个。
select A.UserID, A.Data as Min_data ,c.data as Max_data
from test A
join
(
SELECT UserID, MIN(Times) AS Min_Time,
Max(Times) AS Max_Time
FROM test
GROUP BY UserID
) B
ON a.UserID = B.UserID
and A.times = B.Min_Time
join test C
ON C.UserID = B.UserID
and C.times = B.Max_Time
这有几个步骤。
首先是找到每个userid的最早和最晚时间。你喜欢这样:
SELECT UserID,
MIN(Time) startTime,
MAX(Time) endTime
FROM theTable
GROUP BY UserID
然后,您需要使用该结果来获取与开始时间关联的数据。您可以像这样加入上面的摘要查询(虚拟 table)。
SELECT b.UserID,
b.Data startData
FROM (
SELECT UserID,
MIN(Time) startTime,
MAX(Time) endTime
FROM theTable
GROUP BY UserID
) a
JOIN theTable b ON a.UserID = b.UserID AND a.startTime = b.Time
最后,您需要以类似的方式处理最终值。
SELECT b.UserID,
b.Data startData,
c.Data endData
FROM (
SELECT UserID,
MIN(Time) startTime,
MAX(Time) endTime
FROM theTable
GROUP BY UserID
) a
JOIN theTable b ON a.UserID = b.UserID AND a.startTime = b.Time
JOIN theTable c ON a.UserID = c.UserID AND a.startTime = c.Time
这是一个有点棘手的查询,因为您必须连接 table 两次才能从中获取两个详细信息行(开始和结束时间行)。
构建查询的 "club sandwich" 方法应该有助于阐明其工作原理。
您好,我正在尝试对 table 上的某些元素进行 select。这是我的 table 的样子 Time、UsrerId、Data。现在我想做的是针对相同的用户 ID,我希望根据时间戳获得数据的第一个和最后一个值。
示例:
Time UserID Data
8 PM 1 200
9 PM 1 300
10 PM 1 100
8 PM 2 150
9 PM 2 250
10 PM 2 350
8 PM 3 100
所以我的结果应该是这样的:
1 200 100
2 150 350
3 100 100
找到每个 userid
min
和 max
时间
然后 Join
主 table 的结果与 userid
和 min time
得到每个 userid
[=24 的 min
数据=]
然后再次将结果与 main table 与 userid
和 max time
相结合,以获得每个 userid
max
数据
试试这个。
select A.UserID, A.Data as Min_data ,c.data as Max_data
from test A
join
(
SELECT UserID, MIN(Times) AS Min_Time,
Max(Times) AS Max_Time
FROM test
GROUP BY UserID
) B
ON a.UserID = B.UserID
and A.times = B.Min_Time
join test C
ON C.UserID = B.UserID
and C.times = B.Max_Time
这有几个步骤。
首先是找到每个userid的最早和最晚时间。你喜欢这样:
SELECT UserID,
MIN(Time) startTime,
MAX(Time) endTime
FROM theTable
GROUP BY UserID
然后,您需要使用该结果来获取与开始时间关联的数据。您可以像这样加入上面的摘要查询(虚拟 table)。
SELECT b.UserID,
b.Data startData
FROM (
SELECT UserID,
MIN(Time) startTime,
MAX(Time) endTime
FROM theTable
GROUP BY UserID
) a
JOIN theTable b ON a.UserID = b.UserID AND a.startTime = b.Time
最后,您需要以类似的方式处理最终值。
SELECT b.UserID,
b.Data startData,
c.Data endData
FROM (
SELECT UserID,
MIN(Time) startTime,
MAX(Time) endTime
FROM theTable
GROUP BY UserID
) a
JOIN theTable b ON a.UserID = b.UserID AND a.startTime = b.Time
JOIN theTable c ON a.UserID = c.UserID AND a.startTime = c.Time
这是一个有点棘手的查询,因为您必须连接 table 两次才能从中获取两个详细信息行(开始和结束时间行)。
构建查询的 "club sandwich" 方法应该有助于阐明其工作原理。