[英]How to get only one result from each group with SQL
我真的不知道如何為此任務提出查詢。
我需要為表中每條記錄的第一行獲取時間,但每當我有一組相同的結果時,我需要在它出現時和信號等於1時得到第一行。
我不知道如何正確解釋它,但我會舉一個例子,你會明白我的意思。
記錄:
ID| Time | Serial | Signal
1| 10:59| 12 | 1
2| 11:00| 12 | 1
3| 11:01| 12 | 1
4| 11:01| 13 | 1
5| 11:02| 12 | 0
6| 11:03| 12 | 0
7| 11:05| 13 | 1
8| 11:07| 12 | 1
所以我需要這個結果:
ID| Time | Serial | Signal
1| 10:59| 12 | 1
4| 11:01| 13 | 1
7| 11:05| 13 | 1
8| 11:07| 12 | 1
你的確切邏輯並不清楚,從我可以收集的信息來看,你想要獲得signal
為1的每一行,其中串行值從一次變為另一次。
這可以使用變量來跟蹤上一行中的序列值(下面我的查詢中的變量@t)。
SELECT ID, Time, `Serial`, `Signal`
FROM ( SELECT ID,
Time,
`Serial`,
`Signal`,
CASE WHEN `Serial` = @t THEN 0 ELSE 1 END AS IsNew,
@t:= `Serial`
FROM T,
(SELECT @t:=0) t2
ORDER BY Time
) t
WHERE IsNew = 1
AND `Signal` = 1
您可以通過為連續的Serial
值生成排名,然后僅選擇具有第一級別的記錄來執行此操作。 試試這個查詢:
SELECT id, atime, serial, asignal
FROM (
SELECT id,
atime,
asignal,
IF(a.serial = @var_serial, (@var_rank:= @var_rank + 1),
@var_rank := 1) AS rank,
(@var_serial := a.serial) AS Serial
FROM test_table a, (SELECT @var_rank := 1, @var_serial := 0) r
ORDER BY id ASC
)a
WHERE asignal = 1
AND rank = 1;
我會開始嘗試類似的東西
SELECT * FROM tablename where Signal=1 GROUP BY Time ORDER BY Time ASC
SELECT * FROM your_table
WHERE id IN (
SELECT MIN(id) FROM your_table
WHERE Signal != 0
GROUP BY Serial
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.