0

次の行を含むテーブルがあります。

 NAME                        RFID                  ACTION    TIME       DATE

Kashif Islam            E2001026770D00742340248A    OUT  12:40:00   1/30/2013
Dr.Arshad Ali Shahid    E2001026770D0212267009D3    IN   13:52:00   1/30/2013
Qasim Mehmood           E2001026770D018223202774    IN   13:52:00   1/30/2013
M.Bilal Khan            E2001026770D009522402D80    IN   13:52:00   1/30/2013
Abdul Hameed            E2001026770D0181248019B8    IN   13:52:00   1/30/2013
Usman Tariq             E2001026770D00862570111D    IN   13:52:00   1/30/2013
Dr. Asif Gondal         E2001026770D012426600B32    IN   13:52:00   1/30/2013
Dr.Arshad Ali Shahid    E2001026770D0212267009D3    OUT  13:52:00   1/30/2013
Dr.Arshad Ali Shahid    E2001026770D0212267009D3    IN   13:53:00   1/30/2013
Dr.Arshad Ali Shahid    E2001026770D0212267009D3    OUT  13:53:00   1/30/2013
Dr.Arshad Ali Shahid    E2001026770D0212267009D3    IN   13:53:00   1/30/2013
Dr.Arshad Ali Shahid    E2001026770D0212267009D3    OUT  13:53:00   1/30/2013
Dr.Arshad Ali Shahid    E2001026770D0212267009D3    IN   13:54:00   1/30/2013
Dr.Arshad Ali Shahid    E2001026770D0212267009D3    OUT  13:54:00   1/30/2013
Aamir Hafeez            E2001026770D01952510155B    IN   13:55:00   1/30/2013
Amjad Ali Anjum         E2001026770D024125401476    IN   13:55:00   1/30/2013
Amjad Ali Anjum         E2001026770D024125401476    OUT  13:56:00   1/30/2013
Dr. Asif Gondal         E2001026770D012426600B32    OUT  13:56:00   1/30/2013
Arif Shah               E2001026770D01852370206D    IN   13:56:00   1/30/2013
Fida ul Hassan          E2001026770D02112720095C    IN   13:56:00   1/30/2013

ACTION今、私は各人の特定の日付の最新情報を取得したいと考えています。

    1/30/2013   13:56:00    OUT Amjad Ali Anjum
    1/30/2013   13:56:00    IN  Arif Shah
    1/30/2013   13:56:00    OUT Dr. Asif Gondal
    1/30/2013   13:54:00    OUT Dr.Arshad Ali Shahid
    1/30/2013   13:56:00    IN  Fida ul Hassan

以下のクエリを使用して取得していますが、正しい結果が得られません。

WITH CTE AS (
SELECT 
   row_number() over (partition by personname order by date) rn,
   date,action,time,
   personname

FROM
   AISDb)
SELECT date,time,action,
       personname
FROM CTE WHERE RN = 1 AND datestamp = '1/30/2013'
4

3 に答える 3

8

フィルターが間違った場所にあり、over() 句内の順序がすべて間違っていたと思います。

;WITH CTE AS (
  SELECT 
   row_number() over (partition by personname order by time DESC) rn,
   date,action,time,
   personname
FROM
   AISDb
WHERE datestamp = '20130130')
SELECT date,time,action,
       personname
FROM CTE WHERE RN = 1;

SQL フィドルのデモ

IN/OUT の両方が同時に記録された場合にタイを破る必要がある場合、1 つの方法は、OUT が最後に発生したと仮定してタイを破ることです。

;WITH CTE AS (
  SELECT 
   row_number() over (partition by personname order by time DESC, action DESC) rn,
   date,action,time,
   personname
FROM
   AISDb
WHERE datestamp = '20130130')
SELECT date,time,action,
       personname
FROM CTE WHERE RN = 1;

SQL フィドルのデモ

于 2013-04-23T16:52:50.617 に答える
2

古典問題。考えられる解決策の 1 つ:

select w.* 
from w
inner join (
    select name, max(time) time
    from w
    where date = '2013-01-30'
    group by Name
) sel on w.Name = sel.Name 
     and w.Time = sel.Time
where w.date = '2013-01-30'

アーロンのフィドルのピギーバック: http://sqlfiddle.com/#!3/335e4/11

いくつかの考慮事項:

  • 日付と時刻の両方を保持する 1 つのフィールドが必要です。フィルタリング、インデックス作成、並べ替え、すべてがより簡単になります。
  • TIE (同じ名前で同時に 2 つのトランザクション) がある場合、このソリューションは両方をもたらします。
于 2013-04-23T17:24:17.120 に答える