Редкие данные: эффективное устройство хранения данных и извлечение в RDBMS

Вы можете использовать numpy.modf для извлечения чисел с плавающими частями fractional и integral и округлять только часть fractional, добавьте в последний раз:

df = pd.DataFrame([110100.0, 1.0, 1.12345678], dtype=np.float32, columns=['col'])

a, b = np.modf(df['col'])
print (b + np.round(a, 7))
0    110100.000000
1         1.000000
2         1.123457
Name: col, dtype: float32

Другое решение умножить на число для округления, преобразовать в целое число и разделить:

val = 10**7
print (df['col'].mul(val).astype(np.int64).div(val))
0    110100.000000
1         1.000000
2         1.123457
Name: col, dtype: float64

5
задан Peter Mortensen 29 January 2010 в 17:29
поделиться

1 ответ

Это - то, как я мог бы смоделировать его. Я не учел таблицу Revisions и таблицу Files, поскольку это должно быть довольно очевидным.

CREATE TABLE Revision_Files
(
    start_revision_number   INT NOT NULL,
    end_revision_number     INT NOT NULL,
    file_number             INT NOT NULL,
    value                   INT NOT NULL,
    CONSTRAINT PK_Revision_Files PRIMARY KEY CLUSTERED (start_revision_number, file_number),
    CONSTRAINT CHK_Revision_Files_start_before_end CHECK (start_revision_number <= end_revision_number)
)
GO

Для получения всех значений для файлов конкретного пересмотра, Вы могли использовать следующий запрос. Соединение с таблицей файлов с внешним объединением позволило бы Вам получить тех, которые не имеют никакого определенного значения для того пересмотра.

SELECT
    REV.revision_number,
    RF.file_number,
    RF.value
FROM
    Revisions REV
INNER JOIN Revision_Files RF ON
    RF.start_revision_number <= REV.revision_number AND
    RF.end_revision_number >= REV.revision_number
GO

Предположение, что я понимаю правильно, что Вы хотите в своей третьей точке, это позволит Вам получить все изменения, для которых конкретный файл имеет определенное значение:

SELECT
    REV.revision_number
FROM
    Revision_Files RF
INNER JOIN Revisions REV ON
    REV.revision_number BETWEEN RF.start_revision_number AND RF.end_revision_number
WHERE
    RF.file_number = @file_number AND
    RF.value = @value
GO
5
ответ дан 14 December 2019 в 19:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: