Ниже для стандартного SQL BigQuery
В случае, если вас интересует максимальное количество дней подряд пользователей на одном рабочем месте:
#standardSQL
SELECT uid, MAX(consecuitive_days) max_consecuitive_days
FROM (
SELECT uid, grp, COUNT(1) consecuitive_days
FROM (
SELECT uid,
COUNTIF(step > 1) OVER(PARTITION BY uid, worksite_id ORDER BY ts) grp
FROM (
SELECT uid, worksite_id, ts,
DATE_DIFF(ts, LAG(ts) OVER(PARTITION BY uid, worksite_id ORDER BY ts), DAY) step
FROM `project.dataset.table`
)
) GROUP BY uid, grp
) GROUP BY uid
В случае, если рабочее место не имеет значения, и Вы ищете только максимальное количество дней подряд:
#standardSQL
SELECT uid, MAX(consecuitive_days) max_consecuitive_days
FROM (
SELECT uid, grp, COUNT(1) consecuitive_days
FROM (
SELECT uid,
COUNTIF(step > 1) OVER(PARTITION BY uid ORDER BY ts) grp
FROM (
SELECT uid, ts,
DATE_DIFF(ts, LAG(ts) OVER(PARTITION BY uid ORDER BY ts), DAY) step
FROM `project.dataset.table`
)
) GROUP BY uid, grp
) GROUP BY uid
Вы можете протестировать, сыграть любой из вышеперечисленных с выборкой данных из вашего вопроса, как в примере ниже
#standardSQL
WITH `project.dataset.table` AS (
SELECT 'u12345' uid, 'worksite_1' worksite_id, DATE '2019-01-01' ts UNION ALL
SELECT 'u12345', 'worksite_1', '2019-01-02' UNION ALL
SELECT 'u12345', 'worksite_1', '2019-01-03' UNION ALL
SELECT 'u12345', 'worksite_1', '2019-01-04' UNION ALL
SELECT 'u12345', 'worksite_1', '2019-01-06' UNION ALL
SELECT 'u1', 'worksite_1', '2019-01-01' UNION ALL
SELECT 'u1', 'worksite_1', '2019-01-02' UNION ALL
SELECT 'u1', 'worksite_1', '2019-01-05' UNION ALL
SELECT 'u1', 'worksite_1', '2019-01-06'
)
SELECT uid, MAX(consecuitive_days) max_consecuitive_days
FROM (
SELECT uid, grp, COUNT(1) consecuitive_days
FROM (
SELECT uid,
COUNTIF(step > 1) OVER(PARTITION BY uid ORDER BY ts) grp
FROM (
SELECT uid, ts,
DATE_DIFF(ts, LAG(ts) OVER(PARTITION BY uid ORDER BY ts), DAY) step
FROM `project.dataset.table`
)
) GROUP BY uid, grp
) GROUP BY uid
с результатом: [ 118]
Row uid max_consecuitive_days
1 u12345 4
2 u1 2
Я склонен использовать анонимные внутренние классы в ситуациях, где у меня не должно быть полноценного класса только для выполнения некоторой задачи. Например, если бы я хочу реализовать ActionListener
или Runnable
, но я не думаю, имея внутренний класс, было бы необходимо. Например, для запуска простого Thread
, с помощью анонимного внутреннего класса могло бы быть более читаемым:
public void someMethod()
{
new Thread(new Runnable() {
public void run()
{
// do stuff
}
}).start();
}
В определенных случаях, таких как пример выше, это может увеличить удобочитаемость, специально для одноразовых задач, поскольку код, который должен быть выполнен, все написан в одном месте. Используя внутренний класс "делокализовал" бы код:
public void someMethod()
{
new Thread(new MyRunnable()).start();
}
// ... several methods down ... //
class MyRunnable implements Runnable
{
public void run()
{
// do stuff
}
}
Тем не менее однако, если там будет случаями, где то же самое будет повторным, это должно действительно быть отдельным классом, быть этим регулярный класс или внутренний класс.
я склонен использовать анонимные внутренние классы в программах, где я просто испытываю вещи, а не имею его как центральную функцию реального приложения.
Нет ничего по сути различного или особенное об анонимных классах. Они - в конечном счете просто синтаксический сахар с поддержкой ссылки на внешний класс. Это помогает создать адаптеры - точно так же, как большинство реализаций Итератора, возвращенных платформой Наборов.
Я соглашаюсь с тем, какие многие другие сказали в том, что они полезны для маленьких интерфейсов когда только используемый однажды. Но я также добавил бы ограничение, что, если код, внешний к анонимному классу, должен быть изменен, чтобы это работало, затем не используйте анонимный класс.
, Если необходимо начать объявлять, что переменные как финал размещают скоро класс, так как он ссылается на них, затем используйте внутренний класс вместо этого. Я также видел некоторые плохие запахи кода, где финал выстраивает (размера 1), используются для возврата результатов скоро классов.
Я использую Анонимные классы главным образом a) краткая нотация, если интерфейс имеет один или два метода и ее влияние привычки удобочитаемость
b) ситуация, где я привычка смочь выровнять по ширине создание нового класса, например, В колебании, когда необходимо присоединить actionlistner к, позволяю JButton для некоторой тривиальной операции.
Если ограничение объема и доступа как можно больше является хорошей вещью, затем анонимные классы очень хороши. Они ограничены в объеме одним классом, которому нужны они. Когда это является соответствующим, я сказал бы, что анонимные классы хороши.
момент Вы копируете ту же функцию, это становится плохой идеей. Осуществите рефакторинг его в общедоступный класс, который стоит самостоятельно. IDE с рефакторингом функций делают это легким.
Имеет смысл использовать их, но необходимо знать о том, что делается внизу. Я только использую их, если мне нужен класс, чтобы сделать что-то очень определенное, в котором я не нуждаюсь больше нигде.
Это зависит, с чем Вы сравниваете их. Я имел бы их, чем не имел бы их, но затем я смог бы предоставить простые блоки кода к методам как Arrays.sort (), чем имеющий необходимость явно создать класс, содержащий мою реализацию, выдерживают сравнение ().
Я использую анонимные классы главным образом для интерфейсов, которые имеют только отдельный метод, т.е. Выполнимый или ActionListener. Большинство больших интерфейсов гарантирует свои собственные классы или реализацию в уже существующем классе. И поскольку это - мое мнение я, don’t нужны аргументы для поддержки его.
Мы используем анонимные классы regurlarly. Я нахожу их простыми в использовании для реализации интерфейсов, которые имеют только один или два метода и это, где функциональность не используется больше нигде. При использовании той же функциональности снова где-то в другом месте должен быть реальный класс, который будет снова использован.
Мое мнение является анонимными классами, делает код менее читаемым. Для реализации анонимных классов слушателей полезны. Для разработки анонимные классы GWT приложения являются лучшим выбором. Для этих случаев, если мы не используем анонимные классы затем, увеличится количество строк кода.