2016-12-08 6 views
0

나는 두 개의 테이블이 : 열 uid, dtime최신 업데이트는 어떻게 가입합니까?

  1. delivery, 사탕이 부여 된 기록 candy을 할 사용자의 경우 사용자의 주머니가
  2. 을 조사 할 때 기록
  3. uidlookupltime

결과는 uid, 0이되어야합니다., candy, 사용자의 주머니에서 무엇이 발견되었는지 알려줍니다 (사용자가 새 캔디를 받으면 이전 캔디를 먹는다 고 가정).

각 조회 전에 여러 배달이있었습니다. 최신 정보 만 필요합니다.

예를 들면,

그래서
select l.uid, l.ltime, 
     d.candy /* ... for max(d.dtime): 
      IOW, I want to sort (d.dtime, d.candy) 
      by the first field in decreasing order, 
      then take the second field in the first element */ 
from delivery d 
join lookup l 
on d.uid = l.uid 
and d.dtime <= l.ltime 
group by l.uid, l.ltime 

, 어떻게 조회에 의해 발견 된 것을 알 수 있습니까?

+0

시간을 추가 내 대답을 업데이트 룩업 테이블에 가입하세요. 죄송합니다. –

답변

1

를 사용하여 최고 1 최신 전달을 얻고 다시

Select * from lookup 
    Inner Join (
     Select Top 1 with Ties uid,dtime 
      From delivery 
      Order by row_number() over (partition by uid order by dtime desc)) as Delivery 
      on lookup.uid = Delivery.uid and lookup.ltime >= delivery.dtime 
+1

답변이 다른 답변보다 나은가요? – sds

+0

@sds. . . 나는이 사람이 어떻게 일할 지조차도 모르지만, 아마도 나는 뭔가를 놓치고 있습니다. –

+0

@ Gordon Row_number에 의해 순서가 매겨지는 Top 1은 최신 전송 세트를 제공하고 그 다음에 파생 테이블에 대한 내부 결합 만 제공합니다. –

1

나는 outer apply을 제안 : 귀하의 질문에 대한 대답

select l.*, d.candy 
from lookup l outer apply 
    (select top 1 d.* 
     from delivery d 
     where d.uid = l.uid and d.dtime <= l.ltime 
     order by d.dtime desc 
    ) d; 

합니다. 그러나, 사용자가 마지막 검색 이후 사탕을 가지고 있지 않습니까? 또는 사용자가 다른 것을 제공 받았을 때 사용자가 사탕을 먹는다고 가정하고 있습니까? 아마도 주머니에는 사탕 하나만 들어있을 것입니다. 넥타이와

+0

"호주머니는 단지 하나의 사탕 만 들고 있습니다"라는 큰 웃음 거리가 있습니다. 고맙습니다! – SqlZim

+0

글쎄, "주머니에는 사탕 하나만 들어 있습니다"_is_ 상태는 편집을 참조하십시오. 감사! – sds