Как рассчитать первое появление события, сгруппированного по типу? - PullRequest
1 голос
/ 16 марта 2020

Извиняюсь за базовый c вопрос, я не смог найти ответ после поиска.

У меня есть стол с командой , фруктами , событие и отметка времени .

CREATE TABLE table1
(`team` int, `event` varchar(6), `fruit` varchar(6), 
`timestamp` timestamp)
;

INSERT INTO table1
(`team`, `event`, `fruit`, `timestamp`)
VALUES
(100, 'seen', 'apple', '2005-06-20 12:13:00'),
(100, 'bought', 'apple', '2005-06-20 12:14:00'),
(100, 'seen', 'banana', '2005-06-20 12:15:00'),
(200, 'seen', 'apple', '2005-06-20 12:16:00'),
(200, 'seen', 'apple', '2005-06-20 12:16:00'),
(200, 'seen', 'banana', '2005-06-20 12:16:00'),
(300, 'seen', 'orange', '2005-06-20 12:16:00'),
(300, 'seen', 'apple', '2005-06-20 12:16:00'),
(300, 'bought', 'orange', '2005-06-20 12:17:00'),
(300, 'bought', 'apple', '2005-06-20 12:18:00')
;

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

Предполагается, что все данные в таблице получены за один и тот же день.

Ожидается: apple = 1, orange = 1, banana = 0.

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

Я являюсь новичок в SQL и этот скрипт не учитывает команды.

select fruit, count((select min(timestamp) from table1
where event = "bought")) 
from table1
group by fruit
;

Заранее спасибо!

1 Ответ

1 голос
/ 16 марта 2020

Рассмотрим следующее:

DROP TABLE IF EXISTS table1;

CREATE TABLE table1
(activity_id SERIAL PRIMARY KEY
,`team` int
,`event` varchar(6)
,`fruit` varchar(6),
`timestamp` timestamp)
;

INSERT INTO table1
(`team`, `event`, `fruit`, `timestamp`)
VALUES
(100, 'seen', 'apple', '2005-06-20 12:13:00'),
(100, 'bought', 'apple', '2005-06-20 12:14:00'),
(100, 'seen', 'banana', '2005-06-20 12:15:00'),
(200, 'seen', 'apple', '2005-06-20 12:16:00'),
(200, 'seen', 'apple', '2005-06-20 12:16:00'),
(200, 'seen', 'banana', '2005-06-20 12:16:00'),
(300, 'seen', 'orange', '2005-06-20 12:16:00'),
(300, 'seen', 'apple', '2005-06-20 12:16:00'),
(300, 'bought', 'orange', '2005-06-20 12:17:00'),
(300, 'bought', 'apple', '2005-06-20 12:18:00')
;

Предполагается, что все данные в таблице получены за один и тот же день.

SELECT fruit
     , COUNT(*) total 
  FROM table1 x 
  JOIN 
     ( SELECT MIN(activity_id) activity_id FROM table1 WHERE event = 'bought' GROUP BY team ) y 
    ON y.activity_id = x.activity_id 
 GROUP 
    BY fruit;
+--------+-------+
| fruit  | total |
+--------+-------+
| apple  |     1 |
| orange |     1 |
+--------+-------+

Любые оставшиеся аспекты этой проблемы могут (и, на мой взгляд, должны) быть решены в коде приложения.

...