-4

クエリの方法

SL  STATUS    DATETIME
1   STOP      2012-12-19 13:10:00    
2   STOP      2012-12-19 13:12:00       
3   STOP      2012-12-19 13:14:00   
4   STOP      2012-12-19 13:16:00   
5   STOP      2012-12-19 13:18:00    
6   STOP      2012-12-19 13:20:00
7   START     2012-12-19 13:22:00 

テーブルmysqlクエリから

SL  STATUS    DATETIME                   STOPPAGE
1   STOP      2012-12-19 13:10:00        00:10
2   START     2012-12-19 13:22:00

ステータスがSTOPであるSTOPPAGEとして日付の値の違いを取得する必要があります

4

3 に答える 3

1
SELECT * FROM <TABLENAME> WHERE ID IN (SELECT MIN(ID) GROUP BY STATUS)

これにより、次のようになります

SL  STATUS    DATETIME                   
1   STOP      2012-12-19 13:10:00        
2   START     2012-12-19 13:22:00
于 2012-12-19T12:50:39.047 に答える
0

SELECT sl,status,min(DATETIME) FROM GROUP BY STATUS

于 2012-12-19T12:56:36.407 に答える
0

結果セットで選択したい値をどのように選択しているかは明確ではありませんSL(特に、同じ値DATETIMEを持つレコードが複数ある場合)。不変:DATETIMEDATETIMESTATUS

SELECT my_table.*, t.STOPPAGE
FROM   my_table NATURAL JOIN (
  SELECT   STATUS,
           MIN(DATETIME) AS DATETIME,
           NULLIF(TIMEDIFF(MAX(DATETIME),MIN(DATETIME)),0) AS STOPPAGE
  FROM (
    SELECT   t1.DATETIME, t1.STATUS, MIN(t2.DATETIME) AS next
    FROM     my_table t1 LEFT JOIN my_table t2
          ON t1.DATETIME < t2.DATETIME AND t1.STATUS <> t2.STATUS
    GROUP BY t1.DATETIME, t1.STATUS
  ) t
  GROUP BY next
) t

sqlfiddleで参照してください。

結果セットが必要ない場合SL(またはインクリメント カウンターである必要がある場合)、最も外側のクエリを省略できます。

SELECT   @sl := @sl + 1 AS SL,
         STATUS,
         MIN(DATETIME) AS DATETIME,
         NULLIF(TIMEDIFF(MAX(DATETIME),MIN(DATETIME)),0) AS STOPPAGE
FROM (
  SELECT   t1.DATETIME, t1.STATUS, MIN(t2.DATETIME) AS next
  FROM     my_table t1 LEFT JOIN my_table t2
        ON t1.DATETIME < t2.DATETIME AND t1.STATUS <> t2.STATUS
  GROUP BY t1.DATETIME, t1.STATUS
) t, (SELECT @sl := 0) init
GROUP BY next
ORDER BY DATETIME

sqlfiddleで参照してください。

于 2012-12-19T13:49:53.193 に答える