Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2011.10.16;
Скачать: [xml.tar.bz2];

Вниз

как эта задачка решается Хорошо?   Найти похожие ветки 

 
картман ©   (2011-06-23 17:33) [0]

табличка:
tOper:
group_id, cnt, oper, date

cnt: количество
oper: 0 - приход, 1 - расход

надо получить нд вида:
группа, входящий остаток, приход за период, расход за период;
параметры: начало периода и конец.
Писать на SQL. За один проход по таблице.

написал так:

select group_id,
 sum(case when date < BeginDate then
                      case when oper = 0 then cnt
                              else -cnt
                      end
               else 0
        end) [входящий остаток],
 sum(case when date >= BeginDate and oper = 0 then cnt
               else 0
        end) [приход],
  -"- oper = 1 -"- [расход],
 from tOper
where date <= DateEnd
group by group_id
             
был на собеседовании - сказали плохо и отправили домой:(
Верного ответа не выдали - тайна за семью печатями("Пока не закроем вакансию"). Скажите, есть ли красивше вариант или я просто мордой не вышел?


 
ЫЫАААвот   (2011-06-23 21:43) [1]

Через join.


 
картман ©   (2011-06-23 22:29) [2]


> Через join.

да эт понятно, но условие:

>  За один проход по таблице.

- хотя я не знаю, join сама к себе - один проход?


 
sniknik ©   (2011-06-23 23:54) [3]

> За один проход по таблице.
может ожидали цикл по курсору с формированием нужного/результирующего рекордсета "вручную".
так будет очевидный 1 проход... не факт что более быстрый чем запрос, даже с джойном, но очевидный.


 
картман ©   (2011-06-24 00:13) [4]


> sniknik ©   (23.06.11 23:54) [3]


>  не факт что более быстрый чем запрос, даже с джойном, но
> очевидный.

да явно медленнее будет... ну и в описании задачи: "написать на SQL" - как еще это можно понять?


 
sniknik ©   (2011-06-24 00:45) [5]

> написать на SQL
ну так... а это что не sql?

(пример из BOL)
USE pubs
GO
DECLARE authors_cursor CURSOR FOR
SELECT au_lname FROM authors
WHERE au_lname LIKE "B%"
ORDER BY au_lname

OPEN authors_cursor

-- Perform the first fetch.
FETCH NEXT FROM authors_cursor

-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN
  -- This is executed as long as the previous fetch succeeds.
  FETCH NEXT FROM authors_cursor
END

CLOSE authors_cursor
DEALLOCATE authors_cursor
GO


может поэтому и не взяли?


 
картман ©   (2011-06-24 01:04) [6]


> ну так... а это что не sql?
>
> (пример из BOL)

это ж T-SQL


 
Компромисс   (2011-06-24 11:08) [7]

Может, они хотели исключить те группы, по которым не было движения за указанный период? Тогда еще having надо было бы добавить.

Кстати, что значит через join в данном случае? Не представляю, как он тут может помочь...


 
картман ©   (2011-06-24 11:20) [8]


> Тогда еще having надо было бы добавить.

для краткости я сюда не стал это включать, а так было


> Кстати, что значит через join в данном случае?

по одному соединению посчитаем входящий остаток, по другой приход/расход, в where ограничения: t1.date < DateBegin and t2 between DateBegin and DateEnd - не надо будет каждый раз в select"e в case проверять дату


 
Компромисс   (2011-06-24 11:50) [9]


> по одному соединению посчитаем входящий остаток, по другой
> приход/расход, в where ограничения: t1.date < DateBegin
> and t2 between DateBegin and DateEnd - не надо будет каждый
> раз в select"e в case проверять дату


Все равно не до конца понимаю.

select ...
from tOper before join tOper period on (period.group_id = before.group_id)
where  before.date < BeginDate
and period between BeginDate and EndDate
...

Так, что ли? Я думаю, одна дополнительная проверка даты выполнится гораздо быстрее, чем join. Умные СУБД заметят, что одно и то же условие встречается в нескольких местах.


 
картман ©   (2011-06-24 12:22) [10]


> Так, что ли?

да


> Я думаю, одна дополнительная проверка даты выполнится гораздо
> быстрее, чем join.

наверное


 
RDen ©   (2011-06-24 12:43) [11]

Что за контора, если не секрет, и что за вакансия?


 
Компромисс   (2011-06-24 13:05) [12]

картман ©   (24.06.11 12:22) [10]

Понятно, спасибо.
Странные работодатели ИМХО. У Вас вполне хороший код получился. Если какая-то ошибка и была (или вообще нужно было другую идею использовать), то нельзя отказывать только из-за этого. Мне это напомнило одно java-собеседование, где у меня спрашивали, чем final Integer a = 15 отличается от final Integer b = 150000.
Такое впечатление, что интервью проводил не совсем квалифицированный сотрудник, который зациклен.


 
картман ©   (2011-06-24 13:57) [13]


> RDen ©   (24.06.11 12:43) [11]
>
> Что за контора, если не секрет, и что за вакансия?

http://hh.ru/vacancy/4478946


 
картман ©   (2011-06-24 14:02) [14]


> Компромисс   (24.06.11 13:05) [12]


> Странные работодатели ИМХО.

да и задачка слишком уж простенькая - что с ее помощью можно выяснить? К тому ж, давали час на решение))


 
Компромисс   (2011-06-24 14:12) [15]

да и задачка слишком уж простенькая - что с ее помощью можно выяснить? К тому ж, давали час на решение))

Ну, задачка не совсем уж простая, позволяет оценить навыки. Хотя час - слишком много, согласен. ИМХО более полезным оказывается наблюдать за процессом решения задачи, это позволяет лучше оценить соискателя. Смотреть, как человек мучается целый час, я бы не смог :)



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2011.10.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.004 c
2-1309002914
Тимофей Ю.
2011-06-25 15:55
2011.10.16
неправильно выбран тип числа


15-1308836003
картман
2011-06-23 17:33
2011.10.16
как эта задачка решается Хорошо?


1-1269019209
DmitriyG.
2010-03-19 20:20
2011.10.16
Изменение DecimalSeparator


2-1309343844
bon
2011-06-29 14:37
2011.10.16
delphi &amp; c#


6-1243319342
kunka
2009-05-26 10:29
2011.10.16
vpn





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский