簡體   English   中英

如何使用SQL從每個組中只獲得一個結果

[英]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

SQL小提琴

您可以通過為連續的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;

示例: SQLFiddle

我會開始嘗試類似的東西

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.

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