0

同一のスキーマを持つ 2 つのテーブル (THour_IN と THour_OUT) があります: THour_IN の列: Name|date|HourIN THour_OUT の列: Name|date|HourOUT クエリを作成します:

SELECT THour_IN.Name, THour_IN.date, THour_IN.HourIN, THour_OUT.HourOUT FROM THour_IN LEFT JOIN THour_OUT ON (Hour_IN.Name = THour_OUT.Name) AND (Hour_IN.date = THour_OUT.date);

しかし、テーブルに同じ日付の複数の行があるため、これは私の場合は正しくありません。結果は次のとおりです。

Name   date       HourIN    HourOUT
AAA 24/11/2013  17:33:06    20:33:27
AAA 24/11/2013  17:33:06    16:36:06
AAA 24/11/2013  07:33:27    20:33:27
AAA 24/11/2013  07:33:27    16:36:06
BBB 18/11/2013              16:36:06
BBB 19/11/2013  07:33:30    
BBB 21/11/2013  07:29:24    08:33:22
BBB 22/11/2013  07:33:30    16:34:53

2013 年 11 月 24 日の最初の HourIN(07:33:27) と最初の HourOUT (16:36:06)、2 番目の HourIN (17:33:06) と 2 番目の HourOUT (20:33:06) である必要があります。アイデア?

4

2 に答える 2

1

セグメントを作成してから、セグメントを交差させます。

SELECT
  P1.Name, P1.date, P1.HourIN, P1.HourOUT
FROM (
  SELECT
    I.Name, I.date, I.HourIN, O.HourOUT
  FROM
    THour_IN AS I
    LEFT JOIN THour_OUT AS O
      ON (I.Name = O.Name) AND (I.date = O.date)
        AND I.HourIN < H.HourOUT
) AS P1
INNER JOIN (
  SELECT
    I.Name, I.date, I.HourIN, O.HourOUT
  FROM
    THour_IN AS I
    LEFT JOIN THour_OUT AS O
      ON (I.Name = O.Name) AND (I.date = O.date)
        AND I.HourIN < H.HourOUT
) AS P2
  ON P1.name = P2.name AND P1.date = P2.date
    AND P1.HourIN <> P2.HourIN and P1.HourOUT <> P2.HourOUT
    AND P1.HourOUT > P2.HourIN
    AND (P1.HourIN = P2.HourIN AND P1.HourOUT < P2.HourOUT
          OR P1.HourIN > P2.HourIN AND P1.HourOUT = P2.HourOUT)
于 2012-12-18T15:10:05.063 に答える
0

次のようなものを使用できます。

SELECT
  t.Name, 
  t.Date, 
  t.HourIN, (
     SELECT Top 1 HourOut 
     FROM THourOUT o 
     WHERE o.Name=t.Name AND o.Date=t.date And o.HourOUT>t.HourIN 
     ORDER BY o.HourOUT,o.ID ) AS HrOut
FROM THourIN AS t
ORDER BY t.Date, t.HourIN;

上位 1 が重複を返さないように、OUT テーブルに ID を追加したことに注意してください。

欠損値を挿入する例を次に示します。これは、0 または 1 から欠損値の最大数までの整数を含む Numbers テーブルに依存します。数表は多くの点で役立ちます。

INSERT INTO thourin
            (name,
             [date])
SELECT q.name,
       q.DATE
FROM   (SELECT Outs.name,
               Outs.DATE,
               Outs.countofout,
               Ins.countofin
        FROM   (SELECT o.name,
                       o.DATE,
                       Count(o.name) AS CountOfOut
                FROM   thourout o
                GROUP  BY o.name,
                          o.DATE) AS Outs
               LEFT JOIN (SELECT t.name,
                                 t.DATE,
                                 Count(t.name) AS CountOfIn
                          FROM   thourin t
                          GROUP  BY t.name,
                                    t.DATE) AS Ins
                      ON ( Outs.name = Ins.name )
                         AND ( Outs.DATE = Ins.DATE )
        WHERE  (( ( Ins.countofin ) <> [countofout]
                   OR ( Ins.countofin ) IS NULL ))) AS q,
       numbers AS n
WHERE  (( ( n.counter ) > 0
          AND ( n.counter ) <= [countofout] - [countofin] ))
于 2012-12-18T14:04:56.247 に答える