2010-02-09 17 views
6

Tôi cần có được bản ghi hàng đầu 1 từ cùng một khách hàng được chèn trong vòng một giờ. Nếu bản ghi được chèn sau một giờ thì không cần bản ghi đó. Vui lòng xem bảng sau. Đây chỉ là một mẫu của 1000 bản ghi. Tôi đang sử dụng SQL Server 2005.Lấy một bản ghi hàng đầu của cùng một FK về sự khác biệt ngày

alt text http://img651.imageshack.us/img651/3990/customershavingmultiple.png

+0

Sử dụng một hình ảnh làm ví dụ của bạn bị hư câu hỏi của bạn nếu trình duyệt của bạn/proxy từ chối để hiển thị nội dung của bên thứ 3. Có lý do nào để không hiển thị bảng văn bản không? – Unsliced

+0

Rất cám ơn vì đã đề cập đến điều này, Unsliced. Không có lý do cụ thể nào khi hiển thị câu hỏi trong hình ảnh. Tôi sẽ chăm sóc điều này trong tương lai. – Kashif

Trả lời

1

Ý tưởng là như sau

  • Chọn tất cả con đơn đặt hàng trong vòng một giờ với tối thiểu có thể (mẹ) ID của nó. (Tôi giả định ở đây rằng OrderID thấp nhất cũng sẽ là đơn đặt hàng cũ nhất OrderID).
  • Tham gia các kết quả này với bảng gốc.
  • Sử dụng các kết quả này làm cơ sở cho báo cáo cập nhật.

SQL Statement

UPDATE Orders 
SET  ParentOrderID = p.ParentOrderID 
FROM Orders o 
     INNER JOIN (
      SELECT ParentOrderID = MIN(o1.OrderID), OrderID = o2.OrderID 
      FROM Orders o1 
        LEFT OUTER JOIN Orders o2 ON 
        o2.CustomerID = o1.CustomerID 
        AND o2.OrderDate > o1.OrderDate 
        AND DATEADD(hh, -1, o2.OrderDate) < o1.OrderDate 
      GROUP BY o2.OrderID 
     ) p ON p.OrderID = o.OrderID 
+0

Cảm ơn bạn rất nhiều @Lieven. Bạn thật tốt bụng. Tôi đã xem ảnh tiểu sử của bạn. Tôi nghĩ bạn đang ở cùng gia đình. Great pic. – Kashif

+0

Trong trường hợp bạn tự hỏi, khối lượng xấu xí lớn bên dưới là tôi. –

0
select Top 1 * 
from (select orderid, customerid, orderdate, parentorderid from customer where [email protected]) 
where DATEDIFF(mi, orderdate, GETDATE()) > 60 

trật tự bằng cách OrderDate

Note Tôi đã sử dụng một truy vấn phụ ở đây để lọc trên customerid đầu tiên để bạn có được hiệu suất tốt hơn. Bạn nên cố gắng tránh sử dụng các chức năng (DATEDIFF) trong một điều khoản hạn chế trên bộ lớn của ngày

1

Xét bảng sau:

CREATE TABLE [dbo].[Orders](
    [OrderID] [int] IDENTITY(1,1) NOT NULL, 
    [CustomerID] [int] NULL, 
    [OrderDate] [datetime] NULL, 
    CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED 
    (
     [OrderID] ASC 
    ) 
) 

báo cáo kết quả sau đây cho thấy thứ tự cuối cùng đặt của khách hàng trong khung thời gian tiếp theo là các đơn đặt hàng khác.

;With OrderList As 
(
Select Top 100 Percent * From dbo.Orders 
Where OrderDate >= DateAdd(hh, -1, GetDate()) 
Order By OrderDate Desc 
) 
Select 'First' As DataType, 
    CustomerID, Min(OrderID) As OrderID, Min(OrderDate) As OrderDate 
From OrderList 
Group By CustomerID 
Union All 
Select 'Second' As DataType, 
    CustomerID, OrderID, OrderDate 
From OrderList 
Where OrderID Not In 
(
    Select Min(OrderID) As OrderID 
    From OrderList 
    Group By CustomerID 
) 
--Union All 
--Select 'Raw' As DataType, 
-- CustomerID, OrderID, OrderDate 
--From Orders 

Phần cuối cùng được nhận xét khi tôi sử dụng nó để kiểm tra xem tôi có thực sự có đúng hàng hay không.

Tóm lại, câu lệnh With giới hạn các đơn đặt hàng từ bảng đến bảng được đặt trong giờ trước dựa trên ngày hệ thống hiện tại và sắp xếp chúng theo ngày đặt hàng. Câu lệnh đầu tiên (Chọn 'Đầu tiên') sau đó chỉ trích xuất các đơn đặt hàng đầu tiên của khách hàng. Câu lệnh thứ hai (Chọn 'Thứ hai') sau đó trích xuất tất cả các lệnh khác không có trong câu lệnh đầu tiên.

Điều này sẽ hoạt động như bạn mong đợi, Muhammed, tuy nhiên tôi không có 1000 hàng để kiểm tra điều này. Hiệu suất phải được chấp nhận như phần Với phần sẽ tạo ra một bảng tạm thời để làm việc.

Các vấn đề liên quan