1

すべてのレコードがこのような一意の列である結果セットがあります。同じ BusinessID に属する別のレコードがある場合にのみ、新しい日付のレコードを表示したいと考えています。この結果を取得するための私のクエリは

SELECT 
  FirstName, 
  LastName,
  Department,
  StartDate,
  Title,
  PhoneNumber,
  BusinessEntityID
FROM
  (SELECT
     E.BusinessEntityID,
     H.FirstName,
     H.LastName,
     H.Title,
     H.Department,
     E.PhoneNumber,
     E.CountryRegionName,
     E.PostalCode,
     H.StartDate
   FROM 
     CS120Exam_EmployeeDepartmentHistory H
   JOIN 
     CS120Exam_Employee E
   ON 
     E.BusinessEntityID=H.BusinessEntityID ) x 
   ORDER BY BusinessEntityID

そして結果は

BusinessID  FirstName LastName Department StartDate
----------- --------- -------- ---------- ----------
1           aaa       mate     staff      2002-02-02 <----- DO NOT want this 
1           aaa       mate     admin      2004-03-05
2           john      mate     admin      2001-03-06
3           sun       kent     admin      2004-03-05
4           bbb       clark    staff      2006-02-02 <----- DO NOT want this 
4           bbb       clark    admin      2009-03-05
4

4 に答える 4

1

それぞれの最新の日付を見つけるには、サブセレクトが必要ですBusinessEntityID。これを試してください(もちろんテストされていません):

SELECT 
  FirstName, 
  LastName,
  Department,
  StartDate,
  Title,
  PhoneNumber,
  BusinessEntityID
FROM
  (SELECT
     E.BusinessEntityID,
     H.FirstName,
     H.LastName,
     H.Title,
     H.Department,
     E.PhoneNumber,
     E.CountryRegionName,
     E.PostalCode,
     H.StartDate
   FROM 
     CS120Exam_EmployeeDepartmentHistory H
   JOIN 
     CS120Exam_Employee E
   ON 
     E.BusinessEntityID=H.BusinessEntityID ) x 
   WHERE x.StartDate = 
     (SELECT 
        Max(cs.StartDate) 
      FROM
        CS120Exam_EmployeeDepartmentHistory cs
      WHERE
        cs.BusinessEntityID = x.BusinessEntityID)
   ORDER BY BusinessEntityID
于 2012-12-09T05:53:54.957 に答える
0

GROUP BYとmax(startdate)を使用できます

SELECT 
  FirstName,
  LastName,
  Department,
  max(StartDate),
  Title,
  PhoneNumber,
  BusinessEntityID
FROM
  (SELECT 
     E.BusinessEntityID,
     H.FirstName,
     H.LastName,
     H.Title,
     H.Department,
     E.PhoneNumber,
     E.CountryRegionName,
     E.PostalCode,
     H.StartDate
  FROM 
    CS120Exam_EmployeeDepartmentHistory H
  JOIN 
    CS120Exam_Employee E
  ON 
   E.BusinessEntityID=H.BusinessEntityID ) x 
  ORDER BY 
    BusinessEntityID
  GROUP BY 
    FirstName,
    LastName,
    Department,
    Title,
    PhoneNumber,
    BusinessEntityID
于 2012-12-09T05:37:28.650 に答える
0

残りの列でグループ化し、最大の日付を取得することを考えています。この場合、最大日付の単一のレコードを取得します

SELECT FirstName,LastName,Department,max(StartDate),Title,PhoneNumber,BusinessEntityID
FROM
(SELECT E.BusinessEntityID,H.FirstName,H.LastName,H.Title,H.Department,E.PhoneNumber,
E.CountryRegionName,E.PostalCode,H.StartDate
FROM CS120Exam_EmployeeDepartmentHistory H
JOIN CS120Exam_Employee E
ON E.BusinessEntityID=H.BusinessEntityID )x 
group by  FirstName,LastName,Department,Title,PhoneNumber,BusinessEntityID
ORDER BY BusinessEntityID
于 2012-12-09T05:38:31.257 に答える
0
SELECT 
  FirstName, 
  LastName,
  Department,
  StartDate,
  Title,
  PhoneNumber,
  BusinessEntityID
FROM
  (SELECT
     E.BusinessEntityID,
     H.FirstName,
     H.LastName,
     H.Title,
     H.Department,
     E.PhoneNumber,
     E.CountryRegionName,
     E.PostalCode,
     H.StartDate,
     row_number() over (partition by BusinessID order by StartDate desc) as rn
   FROM 
     CS120Exam_EmployeeDepartmentHistory H
   JOIN 
     CS120Exam_Employee E
   ON 
     E.BusinessEntityID=H.BusinessEntityID ) x 
WHERE rn = 1
ORDER BY BusinessEntityID

サブセレクトを使用して最大値を取得するよりも高速な場合があります。テーブルに対する単一のスキャンのみが必要なためです。

于 2012-12-09T07:53:32.747 に答える