Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» SQL запрос

Автор: MrZeRo
Дата сообщения: 31.12.2013 16:19
bandyn
Если просто максимальную дату, зачем PARTITION вообще?
MAX(end_date) OVER ()
Автор: Futurism
Дата сообщения: 19.01.2014 20:37
Друзья, (особенно те, кто классно знает аксесс))
пытаюсь решить вроде простую задачу по расчету бюджета, но у меня не получается.
есть база данных аксесс. В ней 3 базы.
кампании
платежи
пользователи

В целях конфиденциальности все закодировано
Кампании. Тут указан номер рекл. кампании, её название и выделенный на нее бюджет
Платежи тут id пользователя и сколько в мес он платит за то или приложение(пусто значит не платил)
Пользователи тут номер пользователя и рекл кампании, с которой он вышел на приложение. (u133206_ это id пользователя, и номер компании с которой он пришел cpn_2 т.е. тут 2-ая

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

Как написать sql запрос, чтобы высчитать стоимость одного триал пользователя для каждой из рекламных кампаний?;
Общие затраты делятся на количество оформивших "триал"

стоимость одного платного пользователя для каждой из рекламных кампаний?
все затраты делите на купивших что-то
Каково значение ROI для каждой из кампаний?

в идеале запрос должен формировать таблицу такого вида

клетка Е это выплат по кампании (от заплативших)
G- стоимость одного оплатившего


Автор: vikkiv
Дата сообщения: 19.01.2014 21:40
Futurism
1) Имелось ввиду наверное не 3 базы а 3 таблицы или вида?
2) Вообще-то без структуры данных с репрезентативным примером навряд-ли кто поможет, тут дальше коммуникации на уровне общения с духами не уйдёт, только гадальный салон в помощь.
3) ROI какой-то кривой походу, хоть что-то типа привязки к периоду или какое-то подобие дисконтирования не помешало-бы, иначе купили 10 лет назад за 100, сегодня продали за 100 и типа по нулям?
Автор: Futurism
Дата сообщения: 20.01.2014 09:10
vikkiv
да забыл файл выложить с аксесс
http://rghost.ru/51787992
рои тут взял
http://www.marketch.ru/marketing_dictionary/marketing_terms_r/roi/
Считаем "триал" никакого отношения к бизнес-задачи возврата инвестиций не имеющим, тогда все доходы относим на расходы.
Автор: qwertEHOK
Дата сообщения: 23.01.2014 14:50
1. зачем ЭТО делать в аксессе? Экселя вам хватит за глаза
2. напишите вашу формулу с помощью ваших колонок
3. у меня 2003 аксцесс, он вашу БД не открывает


Автор: Big17
Дата сообщения: 25.01.2014 16:28
volser
Смотря какая версия Oracle... В 8-ке вообще JOIN-ов нет.
Автор: qBarmaleyq
Дата сообщения: 01.02.2014 15:38

Цитата:
Как написать sql запрос, чтобы высчитать стоимость одного триал пользователя для каждой из рекламных кампаний?;
Общие затраты делятся на количество оформивших "триал"

select (общие_затраты/колво_оформ_триал) as Cost_1 from имя_таблицы_затраты where id_reklam_compani=(select distinct id_reklam_compani from имя_таблицы_реклам_компании)
Автор: Big17
Дата сообщения: 03.02.2014 22:43
qBarmaleyq
Только для дочернего запроса, наверное не "=", а "IN"
Автор: voixkas
Дата сообщения: 22.03.2014 20:45
Дано: СУБД Oracle 11, таблица "table1":
Код: create table table1 (
id_ number(38) not null,
date_ date not null,
name1 varchar2(30) not null,
name2 varchar2(30) not null,
clob_ clob
);
create unique index ui#table1#set1 on table1 (date_, upper(name1), upper(name2));
alter table table1 add constraint pk#table1#id_ primary key (id_);
Автор: YuriyRR
Дата сообщения: 23.03.2014 00:44
а если 2 записи у которых data name1 name2 одинаковы?
Автор: Big17
Дата сообщения: 29.03.2014 23:07

Цитата:
Есть ли более быстрые варианты выборки?


Индексы расставить на все date поля. Или они уже есть?
Первый вариант нормальный.
Автор: Alex_Piggy
Дата сообщения: 31.03.2014 13:10
Доброе время всем.
Появилась потребность в решении задачи, но знаний и опыта катастрофически не хватает.
Система - SQLite.
Существует три таблицы, например [more=дамп]
Код:
BEGIN TRANSACTION;
CREATE TABLE Test1 (id INTEGER PRIMARY KEY, name TEXT);
INSERT INTO "Test1" VALUES(1,'Ivan');
INSERT INTO "Test1" VALUES(2,'Petr');
INSERT INTO "Test1" VALUES(3,'Sidor');
CREATE TABLE Test2 (id INTEGER PRIMARY KEY, name_id INTEGER,nick TEXT);
INSERT INTO "Test2" VALUES(1,1,'Vanja');
INSERT INTO "Test2" VALUES(2,2,'Petja');
CREATE TABLE Test3 (id INTEGER PRIMARY KEY, name_id INTEGER,data_type INTEGER, data TEXT);
INSERT INTO "Test3" VALUES(1,1,1,'1_Phone1');
INSERT INTO "Test3" VALUES(2,1,1,'1_Phone2');
INSERT INTO "Test3" VALUES(3,1,1,'1_Phone3');
INSERT INTO "Test3" VALUES(4,1,2,'1_Email1');
INSERT INTO "Test3" VALUES(5,2,1,'2_Phone1');
INSERT INTO "Test3" VALUES(6,2,2,'2_Email1');
INSERT INTO "Test3" VALUES(7,3,1,'3_Phone1');
COMMIT;
Автор: Big17
Дата сообщения: 01.04.2014 15:45
Alex_Piggy
Используйте динамический SQL
Автор: Prot_XT
Дата сообщения: 03.05.2014 12:49
Alex_Piggy

Цитата:
Доброе время всем.
Появилась потребность в решении задачи, но знаний и опыта катастрофически не хватает.
Система - SQLite.
Существует три таблицы, например дамп
Текущая обработка
Нужно получить представление вида
Name|Nick|Phone1|Phone2|Phone3|Email1
Ivan|Vanja|1_Phone1|1_Phone2|1_Phone3|1_Email1
Petr|Petja|2_Phone1|||2_Email1
Sidor||3_Phone1||||
Лучше всего - если количество столбцов Phone# равнялось бы максимальному количеству записей с data_type=1 для одного name_id
Возможно ли такое сделать? Если да, то как? Если нет, возможно ли вывести строку, состоящую из определенного количества символов, например, "10 - COUNT(*)" То есть если COUNT (*)=1, то вывести строку из 9 символов "|"? (Будет экспорт в csv и предполагаю склеить поля в одну строку через разделитель и дописать разделители до нужного количества столбцов).
Заранее благодарю.
PS. Прошу прощения за сумбурность изложения и неправильную терминологию.
UPDATE. Вроде понял, но правильно ли? Подробнее...


Задача еще актуальна... или как?
Автор: Alex_Piggy
Дата сообщения: 03.05.2014 14:11
Доброе время, Prot_XT
Сама задача уже не актуальна, но узнать решение будет интересно.
Автор: Prot_XT
Дата сообщения: 05.05.2014 14:41
На сколько я понял, ты хочешь вывести в строчку плавающие значения в некоей другой таблице?

Добавлено:
Или неправильно уловил суть?
Автор: Fsp050
Дата сообщения: 30.09.2014 18:17
помогите, пожалуйста, в скуль написать запрос . есть файл
http://rghost.ru/58284065
надо чтобы на выходе он имел такой вид

выручите, пожалуйста.
Автор: vpilot
Дата сообщения: 02.10.2014 10:43
А в чем в собственно вопрос? У тебя данные уже есть практически в том виде, в каком тебе нужно. Осталось только в нужном порядке выбрать поля, сделать сортировку...
Что-то вроде:
SELECT ID, FIO, Document, Type_Phone, Phone
FROM [имя_базы].[dbo].[имя_таблицы]
ORDER BY ID

У тебя в таблице нет поля №, если это всего лишь порядок строки выборки, тогда можно использовать ROW_NUMBER() и запрос будет выглядеть так:
SELECT ROW_NUMBER() OVER(ORDER BY ID) as Num, ID, FIO, Document, Type_Phone, Phone
FROM [имя_базы].[dbo].[имя_таблицы]
ORDER BY ID
Автор: Fsp050
Дата сообщения: 02.10.2014 18:17
vpilot
ок попробую. а ты можешь подсказать. каким запросом формат даты
02.10.2014 изменить на 02-10-2014. Там просто таких дат много, но нужно именно в таком жанре 02-10-2014
Автор: vikkiv
Дата сообщения: 02.10.2014 19:16
Fsp050 например для SQL Server 2014 можно так: select convert(varchar(10),getdate(),105)
только не забывай версию БД указывать, соответственно функции немного другие (Oracle/Access/MySQL/Postgresql/Sqllite..).. и вообще это БД-ли? больше похоже на csv файл.. SQL для которого через ADO наверное можно сделать,
Автор: vpilot
Дата сообщения: 03.10.2014 13:40
Fsp050
Смотря какая у тебя база и формат поля для хранения даты.
Для случая с MS SQL и полем даты типа datetime при выборке можно конвертировать в nvarchar в любом доступном формате (в твоем случае США - 110)
Выглядеть будет примерно так:
SELECT CONVERT(NVARCHAR(10), имя_поля, 110) as имя_поля FROM имя_таблицы
Автор: Alexzzy
Дата сообщения: 03.10.2014 14:56
vpilot

Цитата:
в твоем случае США - 110

Во как! Телепатия?
Автор: vpilot
Дата сообщения: 03.10.2014 15:08
Alexzzy
Виноват перед vikkiv за "плагиат", свой пост писал с предыдущей страницы


Добавлено:
Вопрос по синхронизации таблиц.
Имеются два связанных сервера MSSQL2008, две базы, в каждой две таблицы (табл1 - заголовок документа, табл2 - содержимое документа). Сервер1 - источник, с него джобом берутся данные из таблиц, немного видоизменяются (убираются/добавляются вычисляемые поля) и выгружаются в таблицы Сервера2. Требуется раз в сутки актуализировать содержимое таблиц Сервера2. Не могу придумать алгоритм. Полностью чистить и прогружать по новой не хочется. Может кто уже сталкивался с подобным?
Автор: Alexzzy
Дата сообщения: 03.10.2014 19:10
vpilot

Цитата:
Виноват перед vikkiv за "плагиат", свой пост писал с предыдущей страницы

Вопрос то про 110.


Цитата:
Вопрос по синхронизации таблиц...

Добавить поле с датой модификации (тип datetime). Заполнять в триггерах значением getdate(). Далее по этой дате можно выборочно синхронизировать данные.
Автор: vikkiv
Дата сообщения: 03.10.2014 21:06
упс, действительно 110 верней будет, со 105 стандартом перепутка вышла, по местам месяца с датой глаз замылился.

по синхронизации - согласен с мнением выше, без указания что тащить (по дате обновления/вставки) из разных локаций (если в разных местах стоят) будет тащить по сети и сравнивать всё (трафик/нагрузка), что наверное не сильно отличается от переписывания таблиц (ну разве что за исключением индексации) по производительности. но не забудь что если только тригеры on update/insert оставить - могут потеряться удалённые значения.
Автор: Alexzzy
Дата сообщения: 03.10.2014 21:55
vikkiv

Цитата:
действительно 110 верней будет

Почему 110? Я вот не увидел какой именно формат нужен.

Дополнение по синхронизации.
Да, удаление надо учитывать. Упрощенный рабочий (проверенный и работающий) вариант однонаправленной синхронизации (данные передаются в одну сторону). Например, имеем таблицу SomeTable с первичным ключом SomeID. Для неё создаем таблицу логирования SomeTableLog, с полями
SomeLogID - первичный Identity ключ (может пригодится),
SomeID - "виртуальный" (физически не создается) внешний ключ к SomeTable,
Action - действие с записью в SomeTable (0 - insert, 1 - update, 2 - delete),
ActionDate - дата (и время) действия.
В триггерах SomeTable заполняется таблица SomeTableLog.
Пример при вставке данных:
insert SomeTableLog (SomeID, Action, ActionDate)
select SomeID, 0, getdate() from inserted
Автор: vpilot
Дата сообщения: 03.10.2014 22:52
vikkiv, Alexzzy интересная идея с триггерами, мог бы сэкономить себе кучу времени.
Жаль в конкретном случае не подходит. База-источник - часть "глючного" ПО, от которого пока не удается избавиться. ПО обновляется и либо слетают триггеры, либо ПО отказывается обновляться (какие-то свои внутренние проверки). Есть поля с датой последней модификации, и, наверное, пока остановлюсь на этом варианте. Но ПО очень "чудное" и кто-то уже наступал на грабли с датами модификаций.

А в случае двусторонней синхронизации между двумя базами, которые связаны между собой не на прямую, а через третий сервер, на котором и будут джобы. Нравится идея с триггерами. Допусти веду я на каждой стороне свой лог, при наступлении события (по времени или с подачи пользователем) я запрашиваю лог с двух серверов, выстраиваю цепочку последовательности по времени и... попадаю на ограничение уникальности, к примеру))) такие "камни" обходятся?
Автор: Alexzzy
Дата сообщения: 03.10.2014 23:18
vpilot
Двусторонняя синхронизация таблицы (допускается изменение в обоих БД) это значительно более сложный случай. Для односторонней всё гораздо проще и достаточно рассматривать только последнее изменение с момента последней синхронизации и на его основании делать синхронизацию. Что такое "попадаю на ограничение уникальности" не понятно. В принципе, все "камни" обходятся если правильно подойти в вопросу...
Автор: Fsp050
Дата сообщения: 19.10.2014 13:49
Подскажите пожалуйста, как написать такой запрос. Задачка по информатике)
Известно что 99% значений лежат в пределах 3х стандартных отклонение
Например, среднее =20, стандартное отклонение =5.
т.е. 20+- , диапазон значений лежит от 15-25. 3 стандартных отклонения означает, что 20+-15 т.е. 99% значений лежат в диапазоне от 5 до 35.

есть такой запрос
create table dbo.customer    (
customer_id    int        identity primary key clustered
        ,    customer_name    nvarchar(256)    not null
)

create table dbo.purchase_order    (
            purchase_order_id    int    identity primary key clustered
        ,    customer_id        int    not null
        ,    amount            money    not null
        ,    order_date        date    not null
)


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

должно выглядеть примерно так
Автор: vikkiv
Дата сообщения: 20.10.2014 21:51
Fsp050 - вроде такое может пройти, сходу делал, может математику с границами отклонений проверить надо, возьми образцовую выборку и на ней проверь..
Код: select customer_name,z.od order_date,mn min_amt,mx max_amt from(select cid,od,e,ROW_NUMBER()over(partition by cid order by e desc)r from(select p.customer_id cid,order_date od,abs(a-amount)e from purchase_order p left join(select customer_id cid,avg(amount)a,3*power(varp(amount),.5)s3 from purchase_order group by customer_id)x on x.cid=p.customer_id where abs(a-amount)>s3)y)z left join (select customer_id cid,order_date od,max(amount)mx,min(amount)mn from purchase_order group by customer_id,order_date)w on w.cid=z.cid and w.od=z.od left join customer on customer.customer_id=z.cid where r<=5 order by 1,2

Страницы: 1234567891011121314

Предыдущая тема: Строковый параметр в REG_BINARY


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.