0

SQLクエリで行番号を1つの一意の行に制限する必要があります。これが私が話していることを認識するためのサンプルデータです:

john doe 3000 fog horn drive , ky 40444
john doe 3001 merry lane , ky 40484

リストの最初のものを返したいのですが、これが私のクエリです:

Select 
    DISTINCT p.personID, e.citizenship, 
    rtrim(i.lastname + CASE WHEN i.suffix IS NULL THEN '' ELSE ' ' + i.suffix END) + ', ' + i.firstname + (CASE WHEN i.middlename IS NULL THEN '' ELSE ' ' + i.middlename END) StuName, 
    e.grade, i.gender, p.studentNumber, e.citizenship, e.adult, i.birthdate, 
    e.disability1, e.disability2, ad.city, e.displacedHomemaker, e.homeSchooled, 
    e.localStudentNumber, e.migrant, e.modifiedDate, e.modifiedByID,
    rtrim(Staff.lastname + CASE WHEN Staff.suffix IS NULL THEN '' ELSE ' ' + Staff.suffix END) + ', ' + Staff.firstname + (CASE WHEN Staff.middlename IS NULL THEN '' ELSE ' ' + Staff.middleName END) Staffname, 
    Staff.personID Staffid, i.lastname, i.firstname, i.middlename, i.ssn, 
    ad.phone, ad.state, ad.zip, ad.addressLine1
FROM 
    Person p 
LEFT join 
    Enrollment e ON e.personID = p.personID And isnull(e.noshow, 0) = 0 
LEFT join 
    EnrollmentKY ky ON ky.enrollmentID = e.enrollmentID 
LEFT join 
    [Identity] i ON i.identityID = p.currentIdentityID And i.personID = p.personID 
INNER join 
    Calendar c ON c.calendarID = e.calendarID 
INNER join 
    SchoolYear sy ON sy.endYear = c.endYear AND sy.active = 1 
JOIN 
    staffMember Staff ON Staff.personID = e.modifiedByID 
--join view_students s ON  s.personID = i.personID
left join 
    v_MailingAddress ad ON ad.personID = i.personID And ad.relatedBy = 'household'
                        And ad.endDate IS NULL And isnull(ad.secondary, 0) = 0 
order by 
    i.lastname, i.firstname, i.middlename

編集:SQLコードの最初の行のみを選択する必要があります。これは、複数のアドレスを持つ人に問題があるため、2行が配置され、複数のアドレスを持つ人のデータの最初の行のみが必要になるためです。

4

4 に答える 4

1

LIMITを使用して番号を制限してみてください。出力の。

例えば:

SELECT COLUMN_NAME
FROM TABLE
ORDER BY CONDITION
LIMIT NO_OF_ROWS;
于 2012-08-30T15:22:25.913 に答える
1

DISTINCTキーワードの代わりに「GROUPBY」句を使用してみましたか?

また、サブクエリはどうですか?このタイプのものを書いている場合は、sprocを使用して一時テーブルを作成します。

于 2012-08-30T15:24:43.683 に答える
1

personIdがレコードごとに異なり、アドレスが異なる場合は、のフィールドを追加して、:row_number()が存在するレコードのみを選択できます。row_number = 1

select *
from 
(
  Select p.personID,
    e.citizenship, 
    rtrim(i.lastname + CASE WHEN i.suffix IS NULL THEN '' ELSE ' ' + i.suffix END) + ', ' + i.firstname + (CASE WHEN i.middlename IS NULL THEN '' ELSE ' ' + i.middlename END) StuName, 
    e.grade, 
    i.gender, 
    p.studentNumber, 
    e.citizenship, 
    e.adult, 
    i.birthdate, 
    e.disability1, 
    e.disability2, 
    ad.city, 
    e.displacedHomemaker, 
    e.homeSchooled,
    e.localStudentNumber,
    e.migrant,
    e.modifiedDate,
    e.modifiedByID,
    rtrim(Staff.lastname + CASE WHEN Staff.suffix IS NULL THEN '' ELSE ' ' + Staff.suffix END) + ', ' + Staff.firstname + (CASE WHEN Staff.middlename IS NULL THEN '' ELSE ' ' + Staff.middleName END) Staffname, 
    Staff.personID Staffid,
    i.lastname, 
    i.firstname, 
    i.middlename,
    i.ssn, 
    ad.phone, 
    ad.state, 
    ad.zip, 
    ad.addressLine1,
    row_number() over(partition by p.personid order by p.personid) rn -- add this field
  FROM Person p 
  LEFT join Enrollment e 
    ON e.personID = p.personID 
    And isnull(e.noshow,0)=0 
  LEFT join EnrollmentKY ky 
    ON ky.enrollmentID = e.enrollmentID 
  LEFT join [Identity] i 
    ON i.identityID = p.currentIdentityID 
    And i.personID = p.personID 
  INNER join Calendar c 
    ON c.calendarID = e.calendarID 
  INNER join SchoolYear sy 
    ON sy.endYear = c.endYear 
    AND sy.active = 1 
  JOIN staffMember Staff 
    ON Staff.personID = e.modifiedByID 
  --join view_students s ON  s.personID = i.personID
  left join v_MailingAddress ad 
    ON ad.personID = i.personID 
    And ad.relatedBy = 'household'
    And ad.endDate IS NULL 
    And isnull(ad.secondary,0)=0 
) x
where x.rn = 1
order by x.lastname, x.firstname, x.middlename
于 2012-08-30T15:47:34.643 に答える
-1

編集:質問が変更されたため、元の回答を削除しました。元の回答は、変更された質問に対応する方法ではありません。

NeilHoskinsごとにGROUPBY句を提案します。

于 2012-08-30T15:21:49.930 に答える