2017-08-25 1 views
0

すべての従業員の最初のログイン時間と最後のログアウト時間を日付範囲内で見つける必要があります。これまでのところ私は、GROUP BY句とは異なるアプローチを試みたが、私はこのクエリは、私は私が探していた。しかし、これは私に重複した結果を与えるもの達成MySQL - すべての従業員を取得する最初のパンチと最後のパンチ時間範囲内の時間

SELECT p1.EmpName, p1.LogDate, 
      (SELECT MIN(LogTime) 
    FROM log as p2 
    WHERE p2.EmpName=p1.EmpName 
GROUP BY p2.EmpName) as login, 
      (SELECT MAX(LogTime) 
      FROM log as p2 
      WHERE p2.EmpName=p1.EmpName 
     GROUP BY p2.EmpName) as logout, 
        LogID from log as p1 
      WHERE LogDate 
      BETWEEN '2017-08-05 00:00:00' 
       AND '2017-08-010 00:00:00' 
     GROUP BY SrNo 

を試してみました欲しいものを得ることができません。ここではここでログenter image description here

の実際のテーブルには、私は2番目の絵などが、重複行せずに同じ結果が欲しい、これまでenter image description here

を達成したものです。私は、OVER & PARTITIONがMySQLでは利用できないことが分かりました。私はセルフジョインには不満です。

+0

あなたは、MySQLに 'distinct'機能を使用しようとしましたか?これは複写に役立ち、 – Noob

+0

を選択します。EmpName coloumnでDISTINCTを使用すると、別の日付(同じEmpName)から行が削除され、1つの特定の日付のみが表示されます。 –

+0

その場合、順序を組み合わせてグループを切り替えることができます – Noob

答えて

1

あなたは例えば、別のSELECTにクエリをラップし、その上にGROUP BYを適用することができます。:

SELECT a.EmpName, a.LogDate, a.login, a.logout, a.logID 
FROM (
    SELECT p1.EmpName, p1.LogDate, 
    (SELECT MIN(LogTime) FROM log as p2 WHERE p2.EmpName=p1.EmpName Group by p2.EmpName) as login, 
    (SELECT MAX(LogTime) FROM log as p2 WHERE p2.EmpName=p1.EmpName Group by p2.EmpName) as logout, LogID 
    FROM log as p1 WHERE LogDate Between '2017-08-05 00:00:00' AND '2017-08-010 
    00:00:00' group by SrNo 
) a 
GROUP BY a.EmpName, a.LogDate, a.login, a.logout, a.logID 
+0

パフォーマンスはどうですか? –

+0

4つのグループと一緒に4つのselectステートメントを実行すると、400人の従業員を考慮して実行するのに多くの時間がかかります。 –

+0

400行以上ありますので、うまくいくはずです。 –

関連する問題