С помощью настройки двух строк в представителе для отображений это можно исправить, информация о местоположении для ключа слияния была там, она просто не использовалась. К сожалению, это довольно большая функция, которая требует нескольких импортов:
import sys
import ruamel.yaml
if ruamel.yaml.version_info < (0, 15, 86):
from ruamel.yaml.nodes import MappingNode, ScalarNode
from ruamel.yaml.comments import comment_attrib, merge_attrib
def represent_mapping(self, tag, mapping, flow_style=None):
value = []
try:
flow_style = mapping.fa.flow_style(flow_style)
except AttributeError:
flow_style = flow_style
try:
anchor = mapping.yaml_anchor()
except AttributeError:
anchor = None
node = MappingNode(tag, value, flow_style=flow_style, anchor=anchor)
if self.alias_key is not None:
self.represented_objects[self.alias_key] = node
best_style = True
# no sorting! !!
try:
comment = getattr(mapping, comment_attrib)
node.comment = comment.comment
if node.comment and node.comment[1]:
for ct in node.comment[1]:
ct.reset()
item_comments = comment.items
for v in item_comments.values():
if v and v[1]:
for ct in v[1]:
ct.reset()
try:
node.comment.append(comment.end)
except AttributeError:
pass
except AttributeError:
item_comments = {}
merge_list = [m[1] for m in getattr(mapping, merge_attrib, [])]
merge_pos = getattr(mapping, merge_attrib, [[0]])[0][0] # <<<<<<<< line added
item_count = 0
if bool(merge_list):
items = mapping.non_merged_items()
else:
items = mapping.items()
for item_key, item_value in items:
item_count += 1
node_key = self.represent_key(item_key)
node_value = self.represent_data(item_value)
item_comment = item_comments.get(item_key)
if item_comment:
assert getattr(node_key, 'comment', None) is None
node_key.comment = item_comment[:2]
nvc = getattr(node_value, 'comment', None)
if nvc is not None: # end comment already there
nvc[0] = item_comment[2]
nvc[1] = item_comment[3]
else:
node_value.comment = item_comment[2:]
if not (isinstance(node_key, ScalarNode) and not node_key.style):
best_style = False
if not (isinstance(node_value, ScalarNode) and not node_value.style):
best_style = False
value.append((node_key, node_value))
if flow_style is None:
if ((item_count != 0) or bool(merge_list)) and self.default_flow_style is not None:
node.flow_style = self.default_flow_style
else:
node.flow_style = best_style
if bool(merge_list):
# because of the call to represent_data here, the anchors
# are marked as being used and thereby created
if len(merge_list) == 1:
arg = self.represent_data(merge_list[0])
else:
arg = self.represent_data(merge_list)
arg.flow_style = True
value.insert(merge_pos, (ScalarNode(u'tag:yaml.org,2002:merge', '<<'), arg)) # <<<<< line changed
return node
ruamel.yaml.representer.RoundTripRepresenter.represent_mapping = represent_mapping
yaml_str = """\
foo: &foo
color: red
bar:
name: qux
<<: *foo
"""
yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout)
, что дает:
foo: &foo
color: red
bar:
name: qux
<<: *foo
Вышеуказанное пытается сохранить абсолютную позицию, не занимая удаление или вставку ключа -значение пар.
Вышеуказанное ничего не исправит при использовании следующей версии ruamel.yaml
, которая будет включать эти изменения.
Они используются в разных местах. group by
изменяет весь запрос, например:
select customerId, count(*) as orderCount
from Orders
group by customerId
Но partition by
просто работает с оконной функцией , например row_number
:
select row_number() over (partition by customerId order by orderId)
as OrderNumberForThisCustomer
from Orders
Группа по
обычно уменьшает количество строк, возвращаемых путем их объединения и вычисления средних или сумм для каждой строки. Раздел по
не влияет на количество возвращаемых строк, но меняет способ вычисления результата оконной функции.
У него действительно разные сценарии использования. Когда вы используете GROUP BY, вы объединяете некоторые записи для одинаковых столбцов, и вы получаете совокупность результирующего набора.
Однако, когда вы используете PARTITION BY, ваш набор результатов такой же, но у вас просто агрегирование по оконным функциям, и вы не объединяете записи, у вас все равно будет такое же количество записей.
Вот полезная статья, объясняющая разницу: http://alevryustemov.com/sql/sql-partition-by/
Раздел пассивен, но Группа Является Активным значением
выходное изменение строк, когда группа применяется, главным образом уменьшает следовательно активный, в то время как, в разделе остается тем же созданием его пассивный и также, поскольку их не изменение в выходных строках в разделе следовательно агрегированием, отличается по сравнению с группой.
Когда Вы будете использовать GROUP BY
, получающиеся строки будут обычно меньше затем поступать строки.
, Но, когда Вы используете PARTITION BY
, получающееся количество строки должно совпасть с поступлением.
partition by
на самом деле не сворачивает данные. Он позволяет вам сбросить что-то на основе каждой группы. Например, вы можете получить порядковый столбец в группе путем разбиения по полю группировки и использования rownum()
над строками в этой группе. В результате вы получите нечто похожее на столбец идентичности, который обнуляется в начале каждой группы.
РАЗДЕЛЕНИЕ ПО Делит набор результатов на разделы. Оконная функция применяется к каждому разделу отдельно, и вычисление перезапускается для каждого раздела.
Найдено по этой ссылке: Предложение OVER
PARTITION BY
является аналитическим, а GROUP BY
является агрегированным. Чтобы использовать PARTITION BY
, вы должны содержать его с предложением OVER .
Он предоставляет свернутые данные без свертывания
т.е. Предположим, я хочу вернуть относительное положение региона продаж
Используя PARTITION BY, я могу вернуть сумму продаж для данного регионаи сумму MAX по всем регионам продаж в одной строке.
Это означает, что у вас будут повторяющиеся данные, но это может подойти конечному потребителю в том смысле, что данные были агрегированы, но не потеряны - как в случае с GROUP BY.