Станьте лучшими одна запись того же FK на различии в дате

Я должен стать лучшим 1 запись от того же клиента, введенного в течение одного часа. Если запись вставляется после одного часа затем не нуждаются в том. См. следующую таблицу. Это - просто образец 1000-х записей. Я использую SQL Server 2005.

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

6
задан Kashif 9 February 2010 в 08:56
поделиться

3 ответа

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

  • Выбрать все дочерние заказы в течение одного часа с их минимально возможным (родительским) идентификатором. (Я предполагаю, что самый низкий 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
1
ответ дан 17 December 2019 в 20:31
поделиться
select Top 1 * 
from (select orderid, customerid, orderdate, parentorderid from customer where customerid=@customerid)
where DATEDIFF(mi, orderdate, GETDATE()) > 60

order by orderdate

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

0
ответ дан 17 December 2019 в 20:31
поделиться

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

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 ограничивает заказы из таблицы теми, которые были размещены в течение последнего часа на основе текущей системной даты, и упорядочивает их по дате заказа. Первый оператор (выберите «Первый»), затем извлекает только первые заказы клиента. Второй оператор (выберите «Второй») затем извлекает все остальные заказы, которых нет в первом операторе.

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

1
ответ дан 17 December 2019 в 20:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: