게시물 사이의 시간을 결정하는 효과적인 방법?

Willy_Sunny

나는 시나리오를 가지고 있었고 그것을 위해 코드를 최적화하는 훨씬 더 효율적인 방법이 있기를 바랐습니다.

ticket_thread다음 필드로 명명 된 테이블이 있다고 가정 합니다.

  • threadID
  • ticketID
  • threadType-c2s, s2s, s2c 일 수 있습니다.
  • postTime-날짜 시간
  • 메시지

모든 데이터는 ticketID, postTime 순으로 정렬됩니다.

내 일은 각 c2s에서 s2c까지 필요한 시간, 일명 응답 시간을 결정하는 것입니다.

내 현재 접근 방식은 필터링 된 테이블을 c2s 및 s2c의 두 목록으로 덤프하는 것입니다.

while (!isempty($c2s) || !isempty($s2c)) {

  // popping first record from c2s
  $c2sRecord = array_shift($c2s);

  if (!$c2sRecord['ticketID'] == $s2c[0]['ticketID']) {

    // cannot find a response to the ticket
    echo $c2sRecord['ticketID'] . "<br>";

  } else {

    echo $c2sRecord['ticketID'];

    // popping first response from s2c
    $s2cRecord = array_shift($s2c);

    // print out the response time
    echo " " . date_diff($s2cRecord['postTime'], $c2sRecord['postTime']);

    $filter = true;
    while ($filter) {

      // checking the next record in c2s, if it is a different ticket 
      // OR the new post is placed AFTER service has responded.
      if (($c2s[0]['ticketID'] <> $s2cRecord['ticketID']) 
          or ($c2s[0]['postTime'] > $s2cRecord['postTime'])) {

        // stops the filter
        $filter = false;

      } else {

        // pop out unneeded records (supplementary questions) 
        $c2sRecord = array_shift($c2s);

      }
    }
  }

내 문제는 이것이 너무 오래 걸립니다. SQL로 조작하여 필요한 것을 이와 같이 생성 할 수있는 더 빠른 방법이 있습니까?

table generated from SQL

ticket_id | c2sTime  | s2cTime  | timeTaken | rank
  0012    | 12:20:20 | 12:30:20 | 00:10:00  |   1
  0012    | 12:40:00 | 12:55:30 | 00:15:30  |   2
  0012    | 13:10:20 |   null   |   null    |   3
  0013    | 12:20:20 |   null   |   null    |   1

편집 : 요청 된 샘플 테이블

threadID | ticketID | threadType | postTime | message
  3012   |   0012   |    c2s     | 12:20:20 | customer A's 1st post
  3014   |   0012   |    c2s     | 12:20:30 | Added info to A's 1st post, should not be included
  3015   |   0012   |    s2c     | 12:30:20 | Support responding to A's 1st post
  3016   |   0012   |    s2s     | 12:30:30 | internal chat, should not be included
  3017   |   0012   |    s2s     | 12:30:40 | internal chat, should not be included
  3018   |   0012   |    c2s     | 12:40:00 | A's 2nd post
  3019   |   0012   |    s2c     | 12:55:30 | Support responding to A's 2nd post
  3020   |   0012   |    s2c     | 13:00:00 | Added info to Support's 2nd response, should not be included
  3021   |   0012   |    c2s     | 13:10:00 | A's 3nd post
  3013   |   0013   |    c2s     | 12:20:20 | customer B's 1st post
포즈

모든 창 함수FILTER()절을 지원할 수 있다면 (집계 기반 변형처럼) 작업이 훨씬 더 간단해질 수 있습니다 . 즉 모든 필요는 다음과 같습니다

-- won't work, unfortunately
first_value(post_time) filter (where thread_type = 's2c')
                         over (partition by ticket_id
                               order by post_time
                               rows between current row and unbounded following)

그때까지는 셀프 조인을 사용할 수 있습니다.

select  t.*, row_number() over (partition by t.ticket_id order by t.c2s_time) rank
from    (select    distinct on (coalesce(s2c.thread_id, c2s.thread_id))
                   c2s.ticket_id,
                   c2s.post_time c2s_time,
                   c2s.message c2s_message,
                   s2c.post_time s2c_time,
                   s2c.message s2c_message,
                   s2c.post_time - c2s.post_time time_taken
         from      ticket_thread c2s
         left join ticket_thread s2c on  c2s.ticket_id = s2c.ticket_id
                                     and s2c.thread_type = 's2c'
                                     and c2s.post_time < s2c.post_time
                                     and not exists(select 1
                                                    from   ticket_thread
                                                    where  post_time > c2s.post_time
                                                    and    post_time < s2c.post_time
                                                    and    ticket_id = c2s.ticket_id
                                                    and    thread_type = 's2c')
         where     c2s.thread_type = 'c2s'
         order by  coalesce(s2c.thread_id, c2s.thread_id), c2s.post_time) t
order by t.ticket_id, t.c2s_time;

또는 array_agg()창 기능으로 놀 수 있습니다 .

select  t.*, row_number() over (partition by t.ticket_id order by t.c2s_time) rank
from    (select    distinct on (coalesce((m).thread_id, (t).thread_id))
                   (t).ticket_id,
                   (t).post_time c2s_time,
                   (t).message c2s_message,
                   (m).post_time s2c_time,
                   (m).message s2c_message,
                   (m).post_time - (t).post_time time_taken
         from      (select t, array_agg(t) filter (where thread_type = 's2c')
                                             over (partition by ticket_id
                                                   order by     post_time
                                                   rows between current row and unbounded following) a
                    from   ticket_thread t) t
         left join lateral  (select   m
                             from     unnest(a) m
                             order by (m).post_time
                             limit    1) m on true
         where     (t).thread_type = 'c2s'
         order by  coalesce((m).thread_id, (t).thread_id), (t).post_time) t
order by t.ticket_id, t.c2s_time;

내 내부 테스트에서 자체 조인 변형이 조금 더 빠르며 .NET에서 인덱스를 사용할 수도 있습니다 (ticket_id, post_time). (그러나 성능이 정말로 중요하다면 둘 다 테스트해야합니다).

또는 누락 된 기능을 추가 할 수도 있습니다 (예 : first_agg집계 생성 및 창 함수로 사용).

create or replace function first_agg_val(anyelement, anyelement)
  returns anyelement
  language sql
  immutable
  strict
  as 'select $1';

create aggregate first_agg(
  sfunc    = first_agg_val,
  basetype = anyelement,
  stype    = anyelement
);

select  t.*, row_number() over (partition by t.ticket_id order by t.c2s_time) rank
from    (select    distinct on (coalesce((s2c).thread_id, (c2s).thread_id))
                   (c2s).ticket_id,
                   (c2s).post_time c2s_time,
                   (c2s).message c2s_message,
                   (s2c).post_time s2c_time,
                   (s2c).message s2c_message,
                   (s2c).post_time - (c2s).post_time time_taken
         from      (select t c2s, first_agg(t) filter (where thread_type = 's2c')
                                                 over (partition by ticket_id
                                                       order by     post_time
                                                       rows between current row and unbounded following) s2c
                    from   ticket_thread t) t
         where     (c2s).thread_type = 'c2s'
         order by  coalesce((s2c).thread_id, (c2s).thread_id), (c2s).post_time) t
order by t.ticket_id, t.c2s_time;

필요하지 않은 경우 rank외부 쿼리를 제거 할 수 있습니다 (순전히를 위해 존재 함 rank). (대신 클라이언트 측에서 일반적으로 계산하기 쉽습니다.)

http://rextester.com/BUY9309

추신 : 내 검색어의 time_taken열은 interval. 해당 열이 마음에 들지 않거나 파싱 할 수없는 경우 다음 수식을 대신 사용하여 초 단위 의 시간 차이를 얻을 수 있습니다 .

extract(epoch from <interval expresssion>)

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

게시물의 배열에서 값을 인쇄하는 방법

분류에서Dev

가공하는 시간을 검증하는 효과적인 방법

분류에서Dev

특정 게시물을 본 사용자를 확인하는 방법

분류에서Dev

Laravel-특정 직원의 모든 게시물을 승인하는 방법

분류에서Dev

사용자가 24 시간 후에 게시물을 업데이트하는 것을 방지하는 방법 django

분류에서Dev

Jmeter의 Ultimate Thread Group에서 이상적인 보류 시간을 결정하는 방법

분류에서Dev

Wordpress에서 사용자 지정 게시물을 분류하고 개별적으로 표시하는 방법

분류에서Dev

게시물의 날짜와 시간을 얻는 방법은 무엇입니까?

분류에서Dev

게시물이 추가 될 때 WordPress CMB2 플러그인을 사용하여 조건부 사용자 정의 필드를 표시하는 방법 신규

분류에서Dev

동일한 게시물을 여러 서버에 보내고 데이터를 개별 게시물과 연결하는 방법

분류에서Dev

MongoDB의 모든 문서에 대한 필드의 시간 형식을 수정하는 효율적인 방법

분류에서Dev

플러그인 (고급 사용자 정의 필드) 필드 그룹이있는 게시물을 표시하는 방법은 무엇입니까?

분류에서Dev

본문 데이터 인디 HTTPS 게시물 설정 방법

분류에서Dev

Redshift에서 시간을 비교하는 효율적인 방법

분류에서Dev

WordPress의 첫 번째 게시물을 다른 게시물과 다르게 표시하는 방법은 무엇입니까?

분류에서Dev

내 게시물 사이의 공간을 늘리는 방법은 무엇입니까?

분류에서Dev

Django 사용자에게 게시물을 할당하는 방법

분류에서Dev

사용자 정의 필드별로 게시물을 그룹화하는 방법

분류에서Dev

블로거 첫 번째 게시물을 사용자 정의하는 방법

분류에서Dev

시간 간격에 따라 데이터 프레임을 병합하는 효율적인 방법

분류에서Dev

파일 이름을 Ruby 정규식과 일치시키는 가장 효율적인 방법

분류에서Dev

메서드 호출을 프록시 및 래핑하는 간단하고 효과적인 방법

분류에서Dev

확인란 목록의 게시물 데이터를 다시 사용자 정의 클래스로 바인딩하는 방법

분류에서Dev

SQL 조인을 사용하여 게시물 순서 결정

분류에서Dev

게시물의 ID를 제목으로 설정하는 방법

분류에서Dev

이미지를 게시물로 게시하는 방법, Kotlin + FireStore

분류에서Dev

누군가가 팔로우하는 사람들의 게시물 타임 라인을 얻는 방법

분류에서Dev

게시물에서 사용자의 특정 댓글과 동일한 지역 변수를 설정하는 방법은 무엇입니까? 아마 아주 간단

분류에서Dev

원격 파일의 수정 시간을 확인하는 방법

Related 관련 기사

  1. 1

    게시물의 배열에서 값을 인쇄하는 방법

  2. 2

    가공하는 시간을 검증하는 효과적인 방법

  3. 3

    특정 게시물을 본 사용자를 확인하는 방법

  4. 4

    Laravel-특정 직원의 모든 게시물을 승인하는 방법

  5. 5

    사용자가 24 시간 후에 게시물을 업데이트하는 것을 방지하는 방법 django

  6. 6

    Jmeter의 Ultimate Thread Group에서 이상적인 보류 시간을 결정하는 방법

  7. 7

    Wordpress에서 사용자 지정 게시물을 분류하고 개별적으로 표시하는 방법

  8. 8

    게시물의 날짜와 시간을 얻는 방법은 무엇입니까?

  9. 9

    게시물이 추가 될 때 WordPress CMB2 플러그인을 사용하여 조건부 사용자 정의 필드를 표시하는 방법 신규

  10. 10

    동일한 게시물을 여러 서버에 보내고 데이터를 개별 게시물과 연결하는 방법

  11. 11

    MongoDB의 모든 문서에 대한 필드의 시간 형식을 수정하는 효율적인 방법

  12. 12

    플러그인 (고급 사용자 정의 필드) 필드 그룹이있는 게시물을 표시하는 방법은 무엇입니까?

  13. 13

    본문 데이터 인디 HTTPS 게시물 설정 방법

  14. 14

    Redshift에서 시간을 비교하는 효율적인 방법

  15. 15

    WordPress의 첫 번째 게시물을 다른 게시물과 다르게 표시하는 방법은 무엇입니까?

  16. 16

    내 게시물 사이의 공간을 늘리는 방법은 무엇입니까?

  17. 17

    Django 사용자에게 게시물을 할당하는 방법

  18. 18

    사용자 정의 필드별로 게시물을 그룹화하는 방법

  19. 19

    블로거 첫 번째 게시물을 사용자 정의하는 방법

  20. 20

    시간 간격에 따라 데이터 프레임을 병합하는 효율적인 방법

  21. 21

    파일 이름을 Ruby 정규식과 일치시키는 가장 효율적인 방법

  22. 22

    메서드 호출을 프록시 및 래핑하는 간단하고 효과적인 방법

  23. 23

    확인란 목록의 게시물 데이터를 다시 사용자 정의 클래스로 바인딩하는 방법

  24. 24

    SQL 조인을 사용하여 게시물 순서 결정

  25. 25

    게시물의 ID를 제목으로 설정하는 방법

  26. 26

    이미지를 게시물로 게시하는 방법, Kotlin + FireStore

  27. 27

    누군가가 팔로우하는 사람들의 게시물 타임 라인을 얻는 방법

  28. 28

    게시물에서 사용자의 특정 댓글과 동일한 지역 변수를 설정하는 방법은 무엇입니까? 아마 아주 간단

  29. 29

    원격 파일의 수정 시간을 확인하는 방법

뜨겁다태그

보관