Совет SQL-запроса - самый последний элемент - PullRequest
1 голос
/ 12 декабря 2008

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

custid  prodid  issue   qty     datesold
1       123     2       12      01052008
2       234     1       5       01022008
1       123     1       5       01012008
2       444     2       3       02052008

Как я могу получить (что быстрее) выпуск последней проблемы для всех продуктов для конкретного клиента? Могу ли я иметь образцы для SQL Server 2000 и 2005? Обратите внимание, что таблица содержит более 500 тыс. Строк.

Спасибо

Ответы [ 5 ]

3 голосов
/ 12 декабря 2008

Предполагая, что «последний» определяется по дате (а не по номеру выпуска), этот метод обычно довольно быстрый, при условии приличных показателей:

SELECT
     T1.prodid,
     T1.issue
FROM
     Sales T1
LEFT OUTER JOIN dbo.Sales T2 ON
     T2.custid = T1.custid AND
     T2.prodid = T1.prodid AND
     T2.datesold > T1.datesold
WHERE
     T1.custid = @custid AND
     T2.custid IS NULL

Обработка 500 тыс. Строк - это то, с чем ноутбук, вероятно, справится без проблем, не говоря уже о реальном сервере, так что я бы избежал денормализации вашей базы данных для «производительности». Не добавляйте дополнительное обслуживание, неточность и, прежде всего, головные боли, отслеживая «последний проданный» где-то еще.

РЕДАКТИРОВАТЬ: я забыл упомянуть ... это не касается конкретно случаев, когда две проблемы имеют одинаковую точную дату. Возможно, вам придется настроить его в соответствии с вашими бизнес-правилами для этой ситуации.

3 голосов
/ 12 декабря 2008

Общий SQL; Синтаксис SQL Server не должен сильно отличаться:

SELECT prodid, max(issue) FROM sales WHERE custid = ? GROUP BY prodid;
1 голос
/ 12 декабря 2008

Если вы ищете самую последнюю продажу по дате, возможно, это то, что вам нужно:

SELECT prodid, issue
  FROM Sales 
WHERE custid = @custid 
      AND datesold = SELECT MAX(datesold) 
                       FROM Sales s 
                      WHERE s.prodid = Sales.prodid
                         AND s.issue = Sales.issue
                        AND s.custid = @custid 
1 голос
/ 12 декабря 2008

Это новый проект? Если это так, я бы с осторожностью настроил вашу базу данных и немного почитал о нормализации, чтобы вы могли получить что-то вроде этого:

CustID LastName FirstName
------ -------- ---------
1      Woman    Test
2      Man      Test

ProdID ProdName
------ --------
123    NY Times
234    Boston Globe

ProdID IssueID PublishDate
------ ------- -----------
123    1       12/05/2008
123    2       12/06/2008

CustID OrderID OrderDate
------ ------- ---------
1      1       12/04/2008

OrderID ProdID IssueID Quantity
------- ------ ------- --------
1       123    1       5
2       123    2       12

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

0 голосов
/ 12 декабря 2008

Запрос к существующей растущей исторической таблице слишком медленный!

Настоятельно рекомендуем вам создать новую таблицу tblCustomerSalesLatest, в которой хранятся данные о последних выпусках каждого клиента. и выберите оттуда.

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