:: Visual Foxpro, Foxpro for DOS
первое и второе появления покупателя
Артём
Автор

Сообщений: 119
Дата регистрации: 23.04.2001
Хочу посчитать, для каждого дня, сколько человек приходит в магазин впервые и второй раз
Есть таблица, скажем Trans с полями dt(datetime) и User(int)
User Может "приходить в магазин " несколько раз.
Первый раз он приходит , видимо
SELECT min(dt), user FROM trans GROUP BY user INTO CURSOR SQL_1
А второй раз как попроще написать? подскажите, пожалуйста.



Исправлено 1 раз(а). Последнее : Артём, 10.03.23 01:34
Ratings: 0 negative/0 positive
Re: первое и второе появления покупателя
sphinx

Сообщений: 31302
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Если нужно ПО КАЖДОМУ пользователю:

CLOSE DATABASES
SET DATE GERMAN
CREATE CURSOR curTrans (dt D, user C(20) )
INSERT INTO curTrans (dt, user) VALUES (DATE()-5, 'User1')
INSERT INTO curTrans (dt, user) VALUES (DATE()-10, 'User2')
INSERT INTO curTrans (dt, user) VALUES (DATE()-15, 'User1')
INSERT INTO curTrans (dt, user) VALUES (DATE()-20, 'User2')
INSERT INTO curTrans (dt, user) VALUES (DATE()-25, 'User1')
BROWSE
SELECT MIN(dt) AS SecondDate, user ;
FROM curTrans ;
WHERE dt<>(SELECT MIN(dt) FROM curTrans) ;
GROUP BY user ;
INTO CURSOR curResult
SELECT curResult
BROWSE



Если только по заданному - добавляем условие в WHERE:

... AND user = <Ваш_юзер>


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: первое и второе появления покупателя
Артём
Автор

Сообщений: 119
Дата регистрации: 23.04.2001
где то ошибка:
надо чтобы было
user1 - 01.02.2001
user2 - 02.02.2001
CLOSE DATABASES
SET DATE GERMAN
CREATE CURSOR curTrans (dt D, user C(20) )
INSERT INTO curTrans (dt, user) VALUES (CTOD('01.01.2001'), 'User1')
INSERT INTO curTrans (dt, user) VALUES (CTOD('02.01.2001'), 'User2')
INSERT INTO curTrans (dt, user) VALUES (CTOD('01.02.2001'), 'User1')
INSERT INTO curTrans (dt, user) VALUES (CTOD('02.02.2001'), 'User2')
INSERT INTO curTrans (dt, user) VALUES (CTOD('01.03.2001'), 'User1')
BROWSE
SELECT MIN(dt) AS SecondDate, user ;
FROM curTrans ;
WHERE dt<>(SELECT MIN(dt) FROM curTrans) ;
GROUP BY user ;
INTO CURSOR curResult
SELECT curResult
BROWSE
у меня пробелы в знаниях, если один селект внутри другого, к сожалению.



Исправлено 3 раз(а). Последнее : Артём, 10.03.23 02:29
Ratings: 0 negative/0 positive
Re: первое и второе появления покупателя
sphinx

Сообщений: 31302
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Ога, понял, надо коррелированный запрос:

CLOSE DATABASES
SET DATE GERMAN
CREATE CURSOR curTrans (dt D, user C(20) )
INSERT INTO curTrans (dt, user) VALUES (CTOD('01.01.2001'), 'User1')
INSERT INTO curTrans (dt, user) VALUES (CTOD('02.01.2001'), 'User2')
INSERT INTO curTrans (dt, user) VALUES (CTOD('01.02.2001'), 'User1')
INSERT INTO curTrans (dt, user) VALUES (CTOD('02.02.2001'), 'User2')
INSERT INTO curTrans (dt, user) VALUES (CTOD('01.03.2001'), 'User1')
BROWSE
SELECT MIN(t.dt) AS SecondDate, t.user ;
FROM curTrans t ;
WHERE t.dt<>(SELECT MIN(dt) FROM curTrans WHERE user=t.user) ;
GROUP BY user ;
INTO CURSOR curResult
SELECT curResult
BROWSE


------------------
"Veni, vidi, vici!"(с)




Исправлено 1 раз(а). Последнее : sphinx, 10.03.23 02:35
Ratings: 0 negative/1 positive
Re: первое и второе появления покупателя
Артём
Автор

Сообщений: 119
Дата регистрации: 23.04.2001
Большое Спасибо
Ratings: 0 negative/0 positive
Re: первое и второе появления покупателя
akvvohinc

Сообщений: 4243
Откуда: Москва
Дата регистрации: 11.11.2008
Артём
А второй раз как попроще написать?
Артём
Большое Спасибо

Особенно просто таким способом будет ответить на общий вопрос:
А сколько человек пришло dd.mm.yyyy в N-й раз?



Исправлено 1 раз(а). Последнее : akvvohinc, 10.03.23 05:16
Ratings: 0 negative/2 positive
Re: первое и второе появления покупателя
Артём
Автор

Сообщений: 119
Дата регистрации: 23.04.2001
Мы считаем один, два, много.
Дальше не так интересно считать. Интересная информация, сколько новых клиентов и сколько клиентов возвращается.
Зашли и не вернулись - значит, плохо работаем.
Хотя, чисто академический интерес всегда можно найти.
Ratings: 0 negative/0 positive
Re: первое и второе появления покупателя
Владимир Максимов

Сообщений: 14103
Откуда: Москва
Дата регистрации: 02.09.2000
А не проще тогда подсчитать количество уникальных значений дней?

SELECT
user,
count(DISTINCT dt) as cntDays,
min(dt) as minDt,
max(dt) as maxDt
FROM trans
GROUP BY user
HAVING count(DISTINCT dt) > 1
INTO CURSOR SQL_1

Это недокументированная фича использования DISTINCT с агрегирующей функцией COUNT(). Здесь - количество уникальных (не повторяющихся) значений поля dt в рамках одного значения поля user



Исправлено 2 раз(а). Последнее : Владимир Максимов, 10.03.23 14:12
Ratings: 0 negative/2 positive
Re: первое и второе появления покупателя
akvvohinc

Сообщений: 4243
Откуда: Москва
Дата регистрации: 11.11.2008
Имея индекс по user+дата и пробежавшись один раз по таблице мы для каждой записи легко получаем "порядковый номер посещения" юзера.
После чего просто подсчитываем записи с требуемыми "номерами посещений" за любую дату (это же будет основой и для решения любой другой подобной задачи, которая может появиться в процессе эксплуатации).
Прозрачность такого алгоритма очевидна - он легок и в исполнении и в понимании. И через 10 лет вы без труда за минуту поймете, что вы тут понаписали (в отличие от какого-нибудь "накрученного" SELECT).

Или у вас "чисто академический" интерес решить эту задачу именно с помощью SELECT SQL?
Но тогда как это стыкуется с вашим пожеланием "попроще написать"?

Цитата:
у меня пробелы в знаниях, если один селект внутри другого, к сожалению.
"Попроще написать" - это использовать тот способ, который соответствует вашим текущим знаниям.
Обычно не удается просто написать и забыть - вам придется сопровождать этот код и, возможно, долгое время.
И плохо, если каждый раз вы будете тратить кучу времени, чтобы понять - "И что же я здесь понаписал и как это всё работает!"



Исправлено 2 раз(а). Последнее : akvvohinc, 10.03.23 16:24
Ratings: 0 negative/2 positive
Re: первое и второе появления покупателя
sphinx

Сообщений: 31302
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
+1


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: первое и второе появления покупателя
Артём
Автор

Сообщений: 119
Дата регистрации: 23.04.2001
+1



Исправлено 2 раз(а). Последнее : Артём, 10.03.23 23:07
Ratings: 0 negative/1 positive
Re: первое и второе появления покупателя
sphinx

Сообщений: 31302
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006



------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 1 (Гостей: 1)

© 2000-2024 Fox Club 
Яндекс.Метрика