Mit row_number()
und group by
für den min(dt)
pro address
:
Hinweis: Dies wird nicht korrekt funktionieren, wenn die Person zwischen den gleichen Adressen bewegt.
select
Person_id
, dt = convert(char(10),dt,120)
, Address
from (
select
person_id
, dt = min(dt)
, address
, rn = row_number() over (partition by person_id order by min(dt))
from t
group by person_id, address
) s
where rn = 3
rextester Demo: http://rextester.com/VLTUU16478
kehrt:
+-----------+------------+---------+
| Person_id | dt | Address |
+-----------+------------+---------+
| 1 | 2016-07-16 | 2 |
| 2 | 2016-07-18 | 6 |
+-----------+------------+---------+
Um dies zu lösen richtig für eine Person zwischen den gleichen Adressen zu bewegen, müssen Sie die Lücken und Inseln Problem lösen.
eine zusätzliche Unterabfrage zu der obigen Lösung Hinzufügen so können wir von den Inseln identifizieren und Gruppe:
select
Person_id
, dt = convert(char(10),dt,120)
, Address
from (
select
person_id
, dt = min(dt)
, address
, rn = row_number() over (partition by person_id order by min(dt))
from (
select
person_id
, address
, dt
, island = row_number() over (partition by person_id order by dt)
- row_number() over (partition by person_id, address order by dt)
from t
) s
group by person_id, address, island
) s
where rn = 3
rextester Demo: http://rextester.com/PPIH49666
kehrt:
+-----------+------------+---------+
| Person_id | dt | Address |
+-----------+------------+---------+
| 1 | 2016-07-16 | 3 |
| 2 | 2016-07-18 | 5 |
+-----------+------------+---------+
Wenn die Person aus einer Adresse bewegt, nach einer Bewegung und bewegt sich auf die ursprüngliche Adresse zurück. Hast du eine Lösung? Vielen Dank! – Ice
@Ice Mit einer zweiten Lösung aktualisiert, um das Problem der Lücken und Inseln zu lösen. – SqlZim