2010-08-09 40 views
16

Tôi có một bảng có các cột sau IdSQL server chọn hàng riêng biệt sử dụng hầu hết các giá trị gần đây chỉ

  • ForeignKeyId
  • AttributeName
  • attributeValue
  • Created

Một số dữ liệu có thể trông giống như sau:

1, 1, 'EmailPreference', 'Text', 1/1/2010 
2, 1, 'EmailPreference', 'Html', 1/3/2010 
3, 1, 'EmailPreference', 'Text', 1/10/2010 
4, 2, 'EmailPreference', 'Text', 1/2/2010 
5, 2, 'EmailPreference', 'Html', 1/8/2010 

tôi muốn chạy một truy vấn mà kéo giá trị gần đây nhất của cột attributeValue cho mỗi ForeignKeyId andAttributeName riêng biệt, sử dụng cột tạo để xác định giá trị gần đây nhất. Ví dụ đầu ra sẽ là:

ForeignKeyId AttributeName AttributeValue Created 
------------------------------------------------------- 
1   'EmailPreference' 'Text'   1/10/2010 
2   'EmailPreference' 'Html'   1/8/2010 

Làm cách nào tôi có thể thực hiện việc này bằng SQL Server 2005?

+0

Giá trị không phải là 3, không phải 1, cho EmailPreference/Text/1/10/2010? –

+0

Không, cột đầu tiên trong đầu ra là id khóa ngoài, không phải id hàng – Chris

Trả lời

18

Một cách

select t1.* from (select ForeignKeyId,AttributeName, max(Created) AS MaxCreated 
from YourTable 
group by ForeignKeyId,AttributeName) t2 
join YourTable t1 on t2.ForeignKeyId = t1.ForeignKeyId 
and t2.AttributeName = t1.AttributeName 
and t2.MaxCreated = t1.Created 

Xem thêm Including an Aggregated Column's Related Values cho 5 cách khác nhau để làm điều này loại truy vấn

+0

Đó là một liên kết cung cấp thông tin. Cảm ơn! –

9

Sử dụng:

SELECT x.foreignkeyid, 
     x.attributename, 
     x.attributevalue, 
     x.created 
    FROM (SELECT t.foreignkeyid, 
       t.attributename, 
       t.attributevalue, 
       t.created, 
       ROW_NUMBER() OVER (PARTITION BY t.foreignkeyid, t.attributename 
             ORDER BY t.created DESC) AS rank 
      FROM TABLE t) x 
WHERE x.rank = 1 

Sử dụng một CTE:

WITH summary AS (
    SELECT t.foreignkeyid, 
      t.attributename, 
      t.attributevalue, 
      t.created, 
      ROW_NUMBER() OVER (PARTITION BY t.foreignkeyid, t.attributename 
            ORDER BY t.created DESC) AS rank 
     FROM TABLE t) 
SELECT x.foreignkeyid, 
     x.attributename, 
     x.attributevalue, 
     x.created 
    FROM summary x 
WHERE x.rank = 1 

Đồng thời:

SELECT t.foreignkeyid, 
     t.attributename, 
     t.attributevalue, 
     t.created 
    FROM TABLE t 
    JOIN (SELECT x.foreignkeyid, 
       x.attributename, 
       MAX(x.created) AS max_created 
      FROM TABLE x 
     GROUP BY x.foreignkeyid, x.attributename) y ON y.foreignkeyid = t.foreignkeyid 
               AND y.attributename = t.attributename 
               AND y.max_created = t.created 
Các vấn đề liên quan