Nano Hash - криптовалюты, майнинг, программирование

Как добавить текущие квартальные и годовые средние столбцы в существующую таблицу на SQL Server

У меня есть таблица, которая выглядит так (как пример):

+------------+----------+---------+---------+------+
|    Date    |   NAV    |  YrMn   |  YrQt   |  Yr  |
+------------+----------+---------+---------+------+
| 2/2/2015   | 20201975 | 2015-02 | 2015-Q1 | 2015 |
| 2/5/2015   | 20238246 | 2015-02 | 2015-Q1 | 2015 |
| 2/6/2015   | 20220397 | 2015-02 | 2015-Q1 | 2015 |
| 3/2/2015   | 25597902 | 2015-03 | 2015-Q1 | 2015 |
| 3/3/2015   | 25218728 | 2015-03 | 2015-Q1 | 2015 |
| 3/5/2015   | 25332618 | 2015-03 | 2015-Q1 | 2015 |
| 4/7/2015   | 25418590 | 2015-04 | 2015-Q2 | 2015 |
| 4/8/2015   | 25641822 | 2015-04 | 2015-Q2 | 2015 |
| 4/9/2015   | 25554811 | 2015-04 | 2015-Q2 | 2015 |
| 5/7/2015   | 30366075 | 2015-05 | 2015-Q2 | 2015 |
| 5/11/2015  | 30682382 | 2015-05 | 2015-Q2 | 2015 |
| 5/12/2015  | 30302426 | 2015-05 | 2015-Q2 | 2015 |
| 8/23/2016  | 33089750 | 2016-08 | 2016-Q3 | 2016 |
| 8/24/2016  | 32927879 | 2016-08 | 2016-Q3 | 2016 |
| 8/29/2016  | 32788338 | 2016-08 | 2016-Q3 | 2016 |
| 9/23/2016  | 32027027 | 2016-09 | 2016-Q3 | 2016 |
| 9/26/2016  | 31610061 | 2016-09 | 2016-Q3 | 2016 |
| 9/27/2016  | 31730128 | 2016-09 | 2016-Q3 | 2016 |
| 10/26/2016 | 31585115 | 2016-10 | 2016-Q4 | 2016 |
| 10/27/2016 | 31222400 | 2016-10 | 2016-Q4 | 2016 |
| 10/28/2016 | 31148585 | 2016-10 | 2016-Q4 | 2016 |
| 11/1/2016  | 31216799 | 2016-11 | 2016-Q4 | 2016 |
| 11/2/2016  | 31112343 | 2016-11 | 2016-Q4 | 2016 |
| 11/3/2016  | 30572465 | 2016-11 | 2016-Q4 | 2016 |
+------------+----------+---------+---------+------+

Для простоты я удалил много данных, но для каждого рабочего дня для данных за этот день добавляется строка. Я хочу добавить в эту таблицу два столбца, чтобы у нас был текущий подсчет среднегодового и квартального NAV. Среднее значение представляет собой СЧА с первого числа каждого месяца в том виде, в каком оно указано в таблице. Например, средняя СЧА за 1 кв. 2015 г. будет средней СЧА за 02.02.2015 и 03.02.2015 (вместо среднего значения СЧА каждого дня за эти месяцы), а средняя СЧА за 2015 г. будет средней СЧА за 02.02.2015, 02.03.2015, 07.04.2015 и 07.05.2015. Я хочу, чтобы конечный результат выглядел так:

+------------+----------+---------+---------+------+-------------+-------------+
|    Date    |   NAV    |  YrMn   |  YrQt   |  Yr  | QtAvgBegNAV | YrAvgBegNAV |
+------------+----------+---------+---------+------+-------------+-------------+
| 2/2/2015   | 20201975 | 2015-02 | 2015-Q1 | 2015 |    22899939 |    25396136 |
| 2/5/2015   | 20238246 | 2015-02 | 2015-Q1 | 2015 |    22899939 |    25396136 |
| 2/6/2015   | 20220397 | 2015-02 | 2015-Q1 | 2015 |    22899939 |    25396136 |
| 3/2/2015   | 25597902 | 2015-03 | 2015-Q1 | 2015 |    22899939 |    25396136 |
| 3/3/2015   | 25218728 | 2015-03 | 2015-Q1 | 2015 |    22899939 |    25396136 |
| 3/5/2015   | 25332618 | 2015-03 | 2015-Q1 | 2015 |    22899939 |    25396136 |
| 4/7/2015   | 25418590 | 2015-04 | 2015-Q2 | 2015 |    27892333 |    25396136 |
| 4/8/2015   | 25641822 | 2015-04 | 2015-Q2 | 2015 |    27892333 |    25396136 |
| 4/9/2015   | 25554811 | 2015-04 | 2015-Q2 | 2015 |    27892333 |    25396136 |
| 5/7/2015   | 30366075 | 2015-05 | 2015-Q2 | 2015 |    27892333 |    25396136 |
| 5/11/2015  | 30682382 | 2015-05 | 2015-Q2 | 2015 |    27892333 |    25396136 |
| 5/12/2015  | 30302426 | 2015-05 | 2015-Q2 | 2015 |    27892333 |    25396136 |
| 8/23/2016  | 33089750 | 2016-08 | 2016-Q3 | 2016 |    32558389 |    31979673 |
| 8/24/2016  | 32927879 | 2016-08 | 2016-Q3 | 2016 |    32558389 |    31979673 |
| 8/29/2016  | 32788338 | 2016-08 | 2016-Q3 | 2016 |    32558389 |    31979673 |
| 9/23/2016  | 32027027 | 2016-09 | 2016-Q3 | 2016 |    32558389 |    31979673 |
| 9/26/2016  | 31610061 | 2016-09 | 2016-Q3 | 2016 |    32558389 |    31979673 |
| 9/27/2016  | 31730128 | 2016-09 | 2016-Q3 | 2016 |    32558389 |    31979673 |
| 10/26/2016 | 31585115 | 2016-10 | 2016-Q4 | 2016 |    31400957 |    31979673 |
| 10/27/2016 | 31222400 | 2016-10 | 2016-Q4 | 2016 |    31400957 |    31979673 |
| 10/28/2016 | 31148585 | 2016-10 | 2016-Q4 | 2016 |    31400957 |    31979673 |
| 11/1/2016  | 31216799 | 2016-11 | 2016-Q4 | 2016 |    31400957 |    31979673 |
| 11/2/2016  | 31112343 | 2016-11 | 2016-Q4 | 2016 |    31400957 |    31979673 |
| 11/3/2016  | 30572465 | 2016-11 | 2016-Q4 | 2016 |    31400957 |    31979673 |
+------------+----------+---------+---------+------+-------------+-------------+

Есть ли способ сделать это? Я могу получить правильные числа, но я понятия не имею, как получить их на столе. Например, это дает мне среднегодовое значение:

WITH A AS
(
    SELECT
        s.Date, s.NAV,s.YrMn, s.YrQt, s.Yr, 
        ROW_NUMBER() OVER (PARTITION BY YrMn ORDER BY Date) AS Row
    FROM 
        Portfolio.DailyNAV s
)
SELECT
    Yr,
    CASE
       WHEN Yr = 2015 AND A.Row = 1 THEN AVG(NAV)
       WHEN Yr = 2016 AND A.Row = 1 THEN AVG(NAV)
       WHEN Yr = 2017 AND A.Row = 1 THEN AVG(NAV)
       WHEN Yr = 2018 AND A.Row = 1 THEN AVG(NAV)
       ELSE AVG (NAV)
    END AS [YrAvgBegNAV]
FROM A
WHERE ROW = 1
GROUP BY Yr, Row

Однако это неэффективно, так как мне приходится обновлять код каждый год (или каждый квартал в случае квартальных данных). Кроме того, мне понадобится несколько объединений и просмотров всех этих данных, поэтому я думаю, что имеет смысл иметь все это на столе. Если возможно, я хотел бы изменить свою исходную таблицу, добавив столбцы квартальных и годовых средних данных (как вычисляемые столбцы).


  • Неясно: вы хотите добавить столбцы и выполнить однократное обновление для их заполнения? Или вы хотите создать вычисляемые столбцы? 15.08.2018
  • Я хочу создать вычисляемые столбцы 15.08.2018
  • Будет ли это через представление или жестко закодировано 15.08.2018
  • Это было бы жестко закодировано. Я пытаюсь последовать совету Таба и придумать UDF 16.08.2018

Ответы:


1

Я бы сделал это, создав определяемую пользователем функцию для каждого вычисляемого столбца, которая берет уникальный ключ таблицы (выглядит как столбец Date на основе ваших выборочных данных) и запрашивает таблицу, получая вычисленное значение для этой строки, и использует возвращаемое значение этой функции для моего вычисляемого столбца.

Таким образом, вычисление для QtAvgBegNAV будет примерно таким: = dbo.GetQtAvg([date])

а функция dbo.GetQtAvg() выполнит запрос, возвращающий Qt Average NAV для переданной ей даты.

15.08.2018
  • Спасибо. Я попробую это сделать. 15.08.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..