Получить первую запись того же FK по разнице в датах - PullRequest
6 голосов
/ 09 февраля 2010

Мне нужно получить топ 1 запись от того же клиента, вставленную в течение часа Если запись вставлена ​​через час, она не нужна. Пожалуйста, смотрите следующую таблицу. Это просто образец тысяч записей. Я использую SQL Server 2005.

альтернативный текст http://img651.imageshack.us/img651/3990/customershavingmultiple.png

Ответы [ 3 ]

1 голос
/ 09 февраля 2010

Учитывая следующую таблицу:

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
    )
)

следующее утверждение показывает последний заказ, размещенный клиентом в течение периода времени, за которым следуют другие заказы.

;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

Последняя часть закомментирована, поскольку я использовал ее, чтобы проверить, действительно ли я получил правильные строки.

Короче говоря, оператор With ограничивает заказы из таблицы теми, которые были размещены в течение последнего часа на основе текущей системной даты, и заказывает их по дате заказа. Первый оператор (выберите «Первый») затем извлекает только первые заказы клиента. Затем второй оператор (выберите «Второй») извлекает все остальные ордера, которых нет в первом операторе.

Это должно сработать, как вы и ожидали, Мухаммед, однако у меня нет 1000 строк, чтобы проверить это. Производительность должна быть в порядке, так как часть With создаст временную таблицу для работы.

1 голос
/ 25 февраля 2010

Идея заключается в следующем

  • Выберите все дочерние заказы в течение одного часа с минимально возможным (родительским) идентификатором. (Я предполагаю, что самым низким OrderID будет также самый старый OrderID).
  • Объединить эти результаты с исходной таблицей.
  • Используйте эти результаты в качестве основы для оператора обновления.

Оператор SQL

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 голосов
/ 09 февраля 2010
select Top 1 * 
from (select orderid, customerid, orderdate, parentorderid from customer where customerid=@customerid)
where DATEDIFF(mi, orderdate, GETDATE()) > 60

заказ по дате заказа

Примечание. Я использовал здесь подзапрос, чтобы сначала выполнить фильтрацию по Customerid, чтобы повысить производительность. Вам следует избегать использования функций (DATEDIFF) в ограничительном предложении для больших наборов дат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...