SQL-запрос для получения последней записи для всех отдельных элементов в таблице - PullRequest
4 голосов
/ 06 мая 2010

У меня есть таблица всех продаж, определенная как:

mysql> describe saledata;
+-------------------+---------------------+------+-----+---------+-------+
| Field             | Type                | Null | Key | Default | Extra |
+-------------------+---------------------+------+-----+---------+-------+
| SaleDate          | datetime            | NO   |     | NULL    |       | 
| StoreID           | bigint(20) unsigned | NO   |     | NULL    |       | 
| Quantity          | int(10) unsigned    | NO   |     | NULL    |       | 
| Price             | decimal(19,4)       | NO   |     | NULL    |       | 
| ItemID            | bigint(20) unsigned | NO   |     | NULL    |       | 
+-------------------+---------------------+------+-----+---------+-------+

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

SELECT price FROM saledata WHERE itemID = 1234 AND storeID = 111 ORDER BY saledate DESC LIMIT 1

Однако я хочу получить последнюю продажную цену для всех предметов (ItemID хранятся в отдельной таблице предметов) и вставить их в отдельную таблицу. Как я могу получить эти данные? Я пробовал такие запросы:

SELECT storeID, itemID, price FROM saledata WHERE itemID IN (SELECT itemID from itemmap) ORDER BY saledate DESC LIMIT 1

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

mysql> describe lastsale;
+-------------------+---------------------+------+-----+---------+-------+
| Field             | Type                | Null | Key | Default | Extra |
+-------------------+---------------------+------+-----+---------+-------+
| StoreID           | bigint(20) unsigned | NO   |     | NULL    |       | 
| Price             | decimal(19,4)       | NO   |     | NULL    |       | 
| ItemID            | bigint(20) unsigned | NO   |     | NULL    |       | 
+-------------------+---------------------+------+-----+---------+-------+

1 Ответ

4 голосов
/ 06 мая 2010

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

INSERT INTO lastsale (StoreID, Price, ItemID)
  SELECT s1.StoreID, s1.Price, s1.ItemID
  FROM saledata s1
  LEFT OUTER JOIN saledata s2
    ON (s1.Itemid = s2.Itemid AND s1.SaleDate < s2.SaleDate)
  WHERE s2.ItemID IS NULL;
...