:: Игры Разума
Тож недавно перед собеседованием
alex;

Сообщений: 2850
Откуда: Москва
Дата регистрации: 23.11.2004
Тож недавно перед собеседованием попросили решить пользуясь любыми источниками


в инете эти задачи висят уже давно


ЗЫ Поправил 2,3,6,8




[i]Исправлено 2 раз(а). Последнее : alex;, 19.07.16 13:21
Ratings: 0 negative/0 positive
Re: Тож недавно перед собеседованием
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
alex;
в инете эти задачи висят уже давно
1) Где висят эти задачи?
2) Так взяли или нет? Или надо было все без ошибок решить?


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Тож недавно перед собеседованием
alex;

Сообщений: 2850
Откуда: Москва
Дата регистрации: 23.11.2004
sphinx
alex;
в инете эти задачи висят уже давно
1) Где висят эти задачи?
2) Так взяли или нет? Или надо было все без ошибок решить?

в курилке местной видел и на sql.ru, но я сам хотел порешать

нет, попросили поправить + на c#

вот тока отправил
Ratings: 0 negative/0 positive
Re: Тож недавно перед собеседованием
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
В 4 задаче - если будет дубликат дня (в условии не оговорено что даты уникальны) то на этот день будет ошибка.
Кроме того такой запрос весьма неоптимален - по крайней мере для оракла Очень много CPU тратится на сортировки. Альтернативы:
SELECT DISTINCT T1.DATE1,
(SELECT SUM(T2.AMOUNT)
FROM TBL T2
WHERE T2.DATE1 <= T1.DATE1)
TOTAL_AMOUNT
FROM TBL T1
ORDER BY T1.DATE1;

Тоже не фонтан по производительности, хотя и быстрее раза в 2 и не даёт указанной ошибки.
Ну и с аналитикой вот так будет:
SELECT DISTINCT
T1.DATE1, SUM(T1.AMOUNT) OVER (ORDER BY T1.DATE1) AS TOTAL_AMOUNT
FROM TBL T1
ORDER BY T1.DATE1;

В 10 задаче, ты считаешь не процент попаданий по ВСЕЙ таблице, а лишь процент в рамках каждого id - если id уникальны, то для любой записи получишь 100%
В оракле есть весёлая аналитическая функция RATIO_TO_REPORT как раз позволяющая считать подобные проценты (как по всей таблице, так и по указанному partition-у, т.е. разделу, группе записей) с её использованием запрос можно написать вот так (пустой over - значит считаем процент ко ВСЕМ записям):
SELECT ID,
STRING,
QUANTITY,
RATIO_TO_REPORT(SUM(QUANTITY)) OVER () * 100 PERCENT
FROM (SELECT ID,
STRING,
(LENGTH(STRING) - NVL(LENGTH(REPLACE(STRING, :STR, '')), 0)) /
LENGTH( :STR)
QUANTITY
FROM TBL) C
WHERE QUANTITY > 0
GROUP BY ID, STRING, QUANTITY;

Без этой функции таки придётся делать почти как у тебя - и лучше с CTE, чтобы 2 раза не писать одинаковый подзапрос.
WITH C
AS (SELECT ID,
STRING,
(LENGTH(STRING) - NVL(LENGTH(REPLACE(STRING, :STR, '')), 0)) /
LENGTH( :STR)
QUANTITY
FROM TBL)
SELECT ID,
STRING,
QUANTITY,
QUANTITY / (SELECT SUM(QUANTITY) FROM C) * 100 PERCENT
FROM C
WHERE QUANTITY > 0;
т.к. INSTR (он же charindex в MSSQL) не оптимизируется, то большого смысла ставить это условие в подзапрос я не вижу. Хотя на практике это может и помочь (например 11-й оракл при добавлении такого условия материализует подзапрос - по сути создаёт временную таблицу - иначе работает непосредственно на исходной таблице).
В принципе можно переписать такой запрос и без CTE/подзапросов - использовать как в 4 примере аналитическую функцию, но с заданием окна ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING (т.е. по сути сказать "считай для всей таблицы") - что даёт в итоге вычисление "за 1 проход". Правда писанина получается корявая - наш самодельный occurs придётся повторять 3 раза
SELECT ID,
STRING,
(LENGTH(STRING) - NVL(LENGTH(REPLACE(STRING, :STR, '')), 0)) / LENGTH( :STR)
QUANTITY,
(LENGTH(STRING) - NVL(LENGTH(REPLACE(STRING, :STR, '')), 0)) / LENGTH( :STR) * 100 /
SUM(
(LENGTH(STRING) - NVL(LENGTH(REPLACE(STRING, :STR, '')), 0)) / LENGTH( :STR)
)
OVER ()
PERCENT
FROM TBL
WHERE INSTR(STRING, :STR) > 0;

По 9-му вопросу увы, не Копенгаген


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Тож недавно перед собеседованием
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
По C#
1) .ToString() не нужен для единственного аргумента Console.WriteLine(arg1) - там куча перегрузок под базовые типы, плюс он сам для object вызовет ToString(). Это если не подойдёт ни одна из "простых" перегрузок и будет выбран вариант Console.WriteLine(object arg1)
2) Console.WriteLine("A=" + A.ToString() + ", B=" + B.ToString());
Коряво, лучше
Console.WriteLine("A={0}, B={1}", A, B);
можно и нужный формат отображения задать тут же.
3) a -= 1; это a--; при том можно даже "совместить" эти декременты во 2 примере написав A[a--] и B[b--] в коде вывода, ну и соответственно в начале int sum1 = a-- + b--;
4) хардкодинг i < 5 в условии цикла 6-го примера (надо тот же A.Length пользовать)

Ну и некоторые имена локальных переменных, скажем так, коротки и не мнемоничны sum1, a, b в коде 2 примера...

P.S. Заодно посмотрел как называется функция из 8 примера - это "суперфакториал"


------------------
WBR, Igor




Исправлено 1 раз(а). Последнее : Igor Korolyov, 19.07.16 15:17
Ratings: 0 negative/0 positive
Re: Тож недавно перед собеседованием
alex;

Сообщений: 2850
Откуда: Москва
Дата регистрации: 23.11.2004
Игорь, спасибо - все четко расписал

а если для 10 задачи так
declare @STR varchar(3)
set @STR = '123'
declare @t table (ID Int, String VarChar(200))
insert into @t values(1, '123456123')
insert into @t values(1, '12345612');
with cte as (
select [ID], [String], (len([String])-len(replace([String],@STR,'')))/len(@STR) as [Quantity]
from @t TBL
where charindex(@STR, [String]) > 0),
cte2 as (
select sum([Quantity]) as [Quantity] from cte)
select cte.[ID], [String], cast(cte.[Quantity] as float)/cte2.[Quantity]*100 as [Percent]
from cte2, cte



Исправлено 1 раз(а). Последнее : alex;, 19.07.16 15:41
Ratings: 0 negative/0 positive
Re: Тож недавно перед собеседованием
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Ну так это практически то же самое что и я писал в предпоследнем примере-запросе - просто с выделением суммирующего подзапроса в CTE


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Тож недавно перед собеседованием
Гулин Федор
Автор

Сообщений: 4633
Откуда: Минск
Дата регистрации: 24.10.2002
мс-скл мой осн. тул щас

exec sp_MSdependencies 'Stg.INF_Transaction', null, 0x140010

stackoverflow.com
однако недокум. фича похоже
однако не знал - полез бы в инфо таблицы с метаданными - там есть

начсет остальных задач - за компом с гоглм все порешал бы
а вот на бумаге - не факт
полезная гимнатсика для ума - правда на собесдовании где стресс бывает даже что знаешь не ответишь.
Ratings: 0 negative/0 positive


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

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

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