SQLのアイテムのペアリングと結果の減算

foreach join mysql select
SQLのアイテムのペアリングと結果の減算

私には、通常の方法では答えを見つけることができない挑戦があります。 私の唯一の他の選択肢は、この関数をスクリプト化し、foreachループを無数のサブクエリでループすることなので、できる限り1つのクエリで実行したいです。

それでは、MySQLサーバーにログテーブルがあり、次の列があります。キー、ユーザーID、日時、および位置位置は「開始」、「ログイン」、「終了」になります。

各ログインイベントの「開始」、「ログイン」、「終了」の違いを調べたい。 誰もが私が使用できるSQLクエリのアイデアを持っていますか? クエリ内のクエリと関係があると思いますが、JOINしか見つかりませんか?

最初に「開始」イベントを選択し、次に「開始」イベントごとに「ユーザーID」の次の最初のログインイベントを検索する必要があると仮定します(「開始」の時刻の後、次に、同じ「UserID」の「開始」)、次にDATE_SUB()で違いを見つけます。 どちらかが発生しなかった場合に備えて、将来の「開始」イベントの後に発生する「ログイン」または「終了」イベントを除外することが重要です。

誰かがこれをExcelで保存してくれれば、何千ものvlookupsで汚すぎることを避けることができるので、とても感謝しています。 私はこれをPHPまたはPerlで実行し、LIMIT 1 SQLステートメントでループを作成することを考えていますが、1つのまともなSQL SELECTステートメントと比較して数千のSQLクエリが作成される可能性があります。

  0  0


ベストアンサー

MySQLについてはよくわかりません。 MS Sql Serverでは、次のようなものを試します。

SELECT Key, UserID, DateTime, Position,
    (DateTime - (SELECT MAX(DateTime) FROM  t1
                 WHERE t1.UserID=UserID AND t1.DateTime < DateTime)) AS DiffToLastEvent
FROM

私は実際にこれを試したことはありませんが、それは私が始めたいものです。 これにより、テーブルからすべての列が選択されます

現在のアイテムと、現在のアイテムの前にユーザー用に作成された最も若いアイテムの時間差を含む追加フィールドがあります。

1


開始日と終了日だけがある場合の基本的なアプローチを次に示します。 「ログイン」の位置がどのように収まるかはよくわからないので、どの出力が必要かをより明確に説明するか、満足できるようにクエリを調整する必要があります。 また、MySQLがインストールされていないため、クエリはSQLサーバーにあります-ごめんなさい!

CREATE TABLE LogTable
(
    id int IDENTITY,
    userId nvarchar(20),
    logDate datetime,
    position nvarchar(5)
)
GO

INSERT INTO LogTable (userId, logDate, position) VALUES ('User1', '2001-01-01', 'start')
INSERT INTO LogTable (userId, logDate, position) VALUES ('User1', '2001-01-02', 'end')
INSERT INTO LogTable (userId, logDate, position) VALUES ('User1', '2001-01-05', 'start')
INSERT INTO LogTable (userId, logDate, position) VALUES ('User1', '2001-01-08', 'end')
INSERT INTO LogTable (userId, logDate, position) VALUES ('User2', '2001-01-01', 'start')
INSERT INTO LogTable (userId, logDate, position) VALUES ('User2', '2001-01-03', 'end')
INSERT INTO LogTable (userId, logDate, position) VALUES ('User2', '2001-01-06', 'start')
INSERT INTO LogTable (userId, logDate, position) VALUES ('User2', '2001-01-07', 'end')
GO

SELECT  log1.userId, log1.logDate AS [start], log2.logDate AS [end],
        DATEDIFF(d, log1.logDate, log2.logDate) AS [Diff. in Days]
FROM    LogTable log1 JOIN
        LogTable log2 ON log1.userId = log2.userId
WHERE   log1.position = 'start'
AND     log2.position = 'end'
AND     log2.logDate > log1.logDate
AND     NOT EXISTS (
    SELECT  *
    FROM    LogTable logDateCheck
    WHERE   logDateCheck.userId = log1.userId
    AND     logDateCheck.logDate >= log1.logDate
    AND     logDateCheck.logDate <= log2.logDate
    AND     logDateCheck.id NOT IN (log1.id, log2.id))
GO

出力は以下のとおりです。

image:https://i.stack.imgur.com/gAWaD.png [クエリからの出力]

0


タイトルとURLをコピーしました