for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Л и с о в о д ы   в с е х   с т р а н,  о б ъ е д и н я й т е с ь !!!  

Список Форумов  :: Игры Разума
   :: Помощь сайту :: 

Тож недавно перед собеседованием
alex;
Автор

Сообщений: 1750
Откуда: Москва
Дата: 19.07.16 10:30:57ОтветитьЦитировать
Тож недавно перед собеседованием попросили решить пользуясь любыми источниками


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


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




[i]Исправлено: alex;, 19.07.16 13:21
Ratings: 0 negative/0 positive

Re: Тож недавно перед собеседованием
sphinx

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


------------------
"Вы поступили правильно, мой друг, но, боюсь, совершили ошибку"..."(с)
Ratings: 0 negative/0 positive

Re: Тож недавно перед собеседованием
alex;
Автор

Сообщений: 1750
Откуда: Москва
Дата: 19.07.16 13:17:40ОтветитьЦитировать
sphinx
alex;
в инете эти задачи висят уже давно
1) Где висят эти задачи?
2) Так взяли или нет? Или надо было все без ошибок решить?

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

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

вот тока отправил
Ratings: 0 negative/0 positive

Re: Тож недавно перед собеседованием
Igor Korolyov

Сообщений: 31995
Дата: 19.07.16 14:39:04ОтветитьЦитировать
В 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

Сообщений: 31995
Дата: 19.07.16 15:10:16ОтветитьЦитировать
По 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




Исправлено: Igor Korolyov, 19.07.16 15:17
Ratings: 0 negative/0 positive

Re: Тож недавно перед собеседованием
alex;
Автор

Сообщений: 1750
Откуда: Москва
Дата: 19.07.16 15:29:45ОтветитьЦитировать
Игорь, спасибо - все четко расписал

а если для 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



Исправлено: alex;, 19.07.16 15:41
Ratings: 0 negative/0 positive

Re: Тож недавно перед собеседованием
Igor Korolyov

Сообщений: 31995
Дата: 19.07.16 16:37:02ОтветитьЦитировать
Ну так это практически то же самое что и я писал в предпоследнем примере-запросе - просто с выделением суммирующего подзапроса в CTE


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: Тож недавно перед собеседованием
Гулин Федор

Сообщений: 3938
Откуда: Минск
Дата: 20.10.16 15:18:58ОтветитьЦитировать
мс-скл мой осн. тул щас

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

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

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



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

On-line: 37 Simple777  and Guests: 36


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