2010-02-21 4 views
6

문제가 있습니다. (약간의 문제 일 수도 있습니다.) 희망을 부탁드립니다. 난 아무데도베이스를 사용하고 여기에 내 코드입니다 :SQL 1 열만에 고유 한 값을 선택하십시오.

SELECT TOP 4 Person.Id_person, Person.Name, Person.Surname, Visit.Date, Visit.Place 
From Person, Visit 
WHERE Visit.Id_person = Person.Id_person 
ORDER BY Visit.DATE DESC 

가 여기 결과입니다 :

3 | Paul | McDonald | 2010-01-19 | Ohio 
3 | Paul | McDonald | 2010-01-18 | New York 
19 | Ted | Malicky | 2009-12-24 | Tokyo 
12 | Meg | Newton | 2009-10-13 | Warsaw 

나는 폴 맥도날드를 복제하지 싶습니다 및 방문 (날짜가) 처음에만 있습니다. 다음과 같은 결과를 얻고 싶습니다.

3 | Paul | McDonald | 2010-01-19 | Ohio 
19 | Ted | Malicky | 2009-12-24 | Tokyo 
12 | Meg | Newton | 2009-10-13 | Warsaw 
.... 

어떻게해야합니까? 당신이 나를 도울 수? :(

+1

sybase * 구체적으로 * 알지는 못하지만 대부분의 데이터베이스에서 분 단위로 그룹화 한 다음 다시 확장하거나 추가 WHERE 조건을 사용하여 해당 그룹에 대한 추가 예약을 필터링해야합니다. 같은 사람. –

+0

@Alliah : 방문 테이블의 경우 (Id_Person, Date)가 고유합니까? –

답변

1

당신은 이전 방문을 필터링 할 where not exists 절을 추가 할 수 있습니다

SELECT TOP 4 p1.Id_person, p1.Name, p1.Surname, v1.Date, v1.Place 
FROM Person p1, Visit v1 
WHERE p1.Id_person = v1.Id_person 
AND NOT EXISTS (
    SELECT * 
    From Person p2, Visit v2 
    WHERE v2.Id_person = p2.Id_person 
    AND p1.Id_person = p2.Id_person 
    AND v2.Date > v1.Date 
) 
ORDER BY v1.DATE DESC 

은 가독성을 향상시키기 위해, 조인 예를 들어, 변경 등의 이중 from 다시 작성 :.

FROM Person v1, Visit v1 
WHERE v1.Id_person = p1.Id_person 

을 입력 :

FROM Person p1 
INNER JOIN Visit v1 ON v1.Id_person = p1.Id_person 
+0

정말 고마워요 :) – Alliah

+0

@Alliah :이 솔루션은 (Id_Person, Date)가 방문 테이블에서 고유하다고 가정합니다. 이 경우이 솔루션을 사용하십시오. 그렇지 않으면 복제본이 생성됩니다. –

+0

@Andomar : SQL Server에서이를 테스트했지만 "Visit.Id_person = Person.Id_person"이 "v1.Id_person = p1.Id_person"이어야하므로 실패했습니다. 하지만 Sybase에서 작동하는지도 모르겠다. 그것이 도움이 될 때를 대비해서 말하십시오. –

4

여기에 다른 방법이 있습니다. ROW_NUMBER 함수를 겨하는 사람이 같은 날에 두 개의 모임이있는 경우 여전히 작동하는지 확인 : 여기

SELECT TOP 4 
    Person.Id_person, 
    Person.Name, 
    Person.Surname, 
    T1.Date, 
    T1.Place 
FROM 
    (SELECT 
     *, 
     ROW_NUMBER() OVER (PARTITION BY Id_person ORDER BY Date DESC) AS rn 
    FROM Visit) AS T1 
JOIN Person 
ON T1.Id_person = Person.Id_person 
WHERE rn = 1 
ORDER BY Date DESC 

은 결과의 내가 얻을 :

: 여기
Id_person Name Surname Date  Place 
3   Paul McDonald 2010-01-19 Ohio 
19  Ted Malicky 2009-12-24 Tokyo 
12  Meg Newton 2009-10-13 Warsaw 
1   Foo Bar  2009-06-03 Someplace 

은 내가 사용하는 테스트 데이터입니다
CREATE TABLE Person (Id_person INT NOT NULL, Name NVARCHAR(100) NOT NULL, Surname NVARCHAR(100) NOT NULL); 
INSERT INTO Person (Id_person, Name, Surname) VALUES 
(3, 'Paul', 'McDonald'), 
(19, 'Ted', 'Malicky'), 
(12, 'Meg', 'Newton'), 
(1, 'Foo', 'Bar'), 
(2, 'Baz', 'Qux'); 

CREATE TABLE Visit (Id_person INT NOT NULL, Date DATE NOT NULL, Place NVARCHAR(100) NOT NULL); 
INSERT INTO Visit (Id_person, Date, Place) VALUES 
(3, '2010-01-19', 'Ohio'), 
(3, '2010-01-18', 'New York'), 
(19, '2009-12-24', 'Tokyo'), 
(12, '2009-10-13', 'Warsaw'), 
(1, '2009-06-03', 'Someplace'), 
(12, '2009-10-13', 'Anotherplace'), 
(2, '2009-05-04', 'Somewhere'); 

SQL Server 2008에서 테스트되었지만 Sybase 구문이 비슷하다고 생각합니다.

+0

한 사람이 동시에 두 장소에있을 수 있습니까? :) – Andomar

+1

@Andomar : 아니요 ... 같은 * 날짜 *, 같은 시간이 아닙니다. 같은 시간에 두 곳을 방문 할 수는 없지만, 이론적으로는 같은 날 다른 도시로 두 차례 다른 방문을 할 수 있습니다. –

+0

DateTime 필드를 사용하는 경우 솔루션이 상당히 간단합니다. –

3

는 쉬운 방법이있다 그리고 그것은 당신에게뿐만 아니라 각 사람에 대한 가장 최근의 여행 보여줄 것이다 : 나는 내 작품에서 아주 자주의 변형을 사용

SELECT TOP 4 Person.Id_person, Person.Name, Person.Surname, Visit.Date, Visit.Place 
    From Person, Visit 
    WHERE Visit.Id_person = Person.Id_person 
     AND (Visit.[Date] = (Select Max([Date]) 
          From Visit Where (Person.Id_person=Visit.Id_Person))) 
    ORDER BY Visit.DATE DESC 

합니다. 유일한주의 사항은 방문 테이블의 "날짜"필드가 DateTime (물론 누군가가 동시에 두 장소에있을 수 없다는 것)입니다.

+0

이 솔루션은 또한 (Id_Person, Date)가 방문 테이블에서 고유하다고 가정합니다. 이것은 유효한 가정 일지 모르지만 OP는 그것을 지정하지 않았습니다. 질문에 댓글을 달았습니다. OP가이 문제를 명확히 해줄 것을 요청했습니다. –

+0

@ 마크 바이어스 - 그 이유는 누군가가 동시에 두 장소에있을 수 없다는 나의 경고에 포함 시켰기 때문입니다. –

관련 문제