2

必要なものを探して2日間狩りましたが、役に立ちませんでした。これも哀れなほど単純だと思いますが、これは私のバッグではありません。

私が持っているテーブルには、EmployeeID と TimeStamp が格納されています。次のように、奇数行と偶数行が新しい列にマップされるように、1 行おきに選択する必要があります。

INPUT テーブルのタイムパンチ:

EmployeeID 時間
1 08:00:00
1 12:00:00
1 12:30:00
1 17:00:00

出力テーブル:

従業員のタイムイン タイムアウト
1 08:00:00 12:00:00
1 12:30:00 17:00:00

行を正確に 2 列に変換する方法を見つけた後、各出力行から時間を計算します。偶数の行が返されない場合、これはガベージを出力することを認識していますが、最初にそこまで取得したい ;)

4

4 に答える 4

1

を含む別のソリューションROW_NUMBER()と、変更のために、PIVOT:

WITH prepared AS (
  SELECT
    EmployeeID,
    Time,
    TimeRow  = (ROW_NUMBER() OVER (PARTITION BY EmployeeID ORDER BY Time) - 1) / 2
    TimeKind =
      CASE (ROW_NUMBER() OVER (PARTITION BY EmployeeID ORDER BY Time) - 1) % 2
        WHEN 0 THEN 'TimeIn'
        WHEN 1 THEN 'TimeOut'
      END
  FROM TimePunches
)
SELECT
  EmployeeID,
  TimeIn,
  TimeOut
FROM prepared
PIVOT (
  MAX(Time) FOR TimeKind IN (TimeIn, TimeOut)
) p
ORDER BY
  EmployeeID,
  TimeRow

SQL Fiddleでこのクエリを試すことができます。

于 2012-04-24T18:30:48.743 に答える
0

1つの解決策は、擬似コードでは次のようになります。

declare @timeIn datetime, @timeOut datetime
declare @emp int

get one row at a time {

if (row is even)
  @timeIn = Time from row
}
else {
  @timeOut = Time from row
  @emp = Employee from row
  insert into #tempTable @emp, @timeIn, @timeOut
}

select #tempTable

一度に行を取得するには、ROW_NUMBERまたはカーソルを使用できます。

于 2012-04-24T16:31:36.083 に答える
0

レコードについては、このテーブル構造を変更する必要がありますが、必要なことは可能です。このクエリはあらゆる種類の汚れを感じさせます。自分のコードで使用することは決して考えませんが、動作するので注意してください。

with rank1 as (
SELECT EmployeeID, Time, RANK() OVER (PARTITION BY EmployeeID ORDER BY Time) as rank
FROM TimePunches),
rank2 as (
SELECT EmployeeID, Time, RANK() OVER (PARTITION BY EmployeeID ORDER BY Time) as rank
FROM TimePunches)

SELECT rank1.EmployeeID, rank1.Time as timeIn, rank2.Time as timeOut
FROM rank1
JOIN rank2 on rank1.EmployeeID = rank2.EmployeeID AND rank1.rank % 2 = 1 AND rank1.rank - (rank1.rank % 2) = rank2.rank
于 2012-04-24T16:43:00.953 に答える
0
with prepared_data as (
  select
    EmployeeID,
    Time,
    row_number() over(partition by EmployeeID order by Time) as num
  from TimePunches
)
select
  p1.EmployeeID,
  p1.Time as TimeIn,
  p2.Time as TimeOut
from
  prepared_data p1
  left join prepared_data p2 on p1.EmployeeID = p2.EmployeeID and p1.num + 1 = p2.num
where
  p1.num % 2 = 1
order by
  p1.EmployeeID,
  p1.num
于 2012-04-24T16:22:45.440 に答える