Хитрость при использовании CASE / WHEN заключается в использовании агрегатных функций, таких как MAX, а затем группирование по всем неагрегированным столбцам:
SELECT
band,
Month,
MAX(CASE
when status = 'one' then response_avg
END) as One,
MAX(CASE
when status = 'two' then response_avg
END) as Two
FROM t1
GROUP BY band,
Month
(Это запустилось как ответ на дублирующийся вопрос. Я сделал немного редактирования света для чистки его.)
Все внутренние стрелки Мерзавца являются односторонними, указывая назад. Нет поэтому никакого короткого удобного синтаксиса для продвижений: это просто не возможно.
возможно "переместиться против стрелок", но способ сделать это удивителен, если Вы не видели его прежде, и затем очевидный позже. Скажем, мы имеем:
A <-B <-C <-D <-E <-- last
^
|
\--------- middle
Используя middle~2
следует за стрелками дважды от C
назад к A
. Таким образом, как мы перемещаемся от [1 110] до [1 111]? Ответ: мы запускаем в [1 112], с помощью имени last
, и работаем назад, пока мы не добираемся до [1 114], запись точек, которые мы посещаем по пути . Тогда мы просто перемещаемся насколько мы хотим в направлении [1 115]: продвиньтесь на один шаг к [1 116], или два к [1 117].
Это особенно важно, когда у нас есть ответвления:
D--E <-- feature1
/
...--B--C <-- master
\
F--G <-- feature2
, Какая фиксация является одним шагом после C
? Нет никакого корректного ответа, пока Вы не добавляете к вопросу: в направлении функции ___ (заполняют пробел).
Для перечисления фиксаций между [1 119] (исключая [1 120]) самостоятельно и, скажем, G
мы используем:
git rev-list --topo-order --ancestry-path master..feature2
Эти --topo-order
удостоверяется, что даже в присутствии сложного ветвления-и-слияния, фиксации выходят в топологически отсортированном порядке. Это только требуется, если цепочка не линейна. --ancestry-path
ограничение означает, что, когда мы работаем назад от [1 124], мы только перечисляем фиксации, которые имеют фиксацию C
как один из их собственных предков. Таким образом, если graph— или соответствующий блок его anyway— на самом деле похожи на это:
A--B--C <-- master
\ \
\ F--G--J <-- feature2
\ /
H-------I <-- feature3
простой запрос формы feature2..master
перечисляет фиксации J
, G
и I
, и F
и H
в некотором порядке. С [1 132] мы выводим из строя H
и I
: они не потомки [1 135], только [1 136]. С [1 137] мы удостоверяемся, что фактический порядок перечисления J
, тогда G
, тогда F
.
git rev-list
управляют разливами эти идентификаторы хеша на его стандартном выводе, один на строку. Для перемещения одного шага вперед в направлении [1 142], тогда, мы просто хотим последний строка.
Это возможно (и привлечение, и может быть полезным) добавить --reverse
так, чтобы git rev-list
печать фиксации в обратном порядке после генерации их. Это действительно работает, но если Вы используете его в конвейере как это:
git rev-list --topo-order --ancestry-path --reverse <id1>...<id2> | head -1
, чтобы просто получить "следующую фиксацию в направлении id2", и существует очень длинный список фиксаций, эти git rev-list
, команда может получить поврежденный канал, когда это пытается записать в [1 146], который прекратил читать его вход и вышел. Так как ошибки повреждать-канала обычно игнорируются оболочкой, это главным образом работает. Просто удостоверьтесь, что они проигнорированы в [1 165] Ваш использование.
также заманчиво добавить -n 1
к эти git rev-list
команда, наряду с [1 149]. Не делайте этого! Это делает git rev-list
остановка после обхода одного шага назад , и затем инвертируйте список (с одной записью) фиксаций, которые посещают. Таким образом, это просто производит <id2>
каждый раз.
стороны, что с фрагментами графика "ромбовидного" или "бензольного кольца":
I--J
/ \
...--H M--... <-- last
\ /
K--L
перемещение вперед одной фиксации от [1 152] к [1 153] получит Вас или I
или K
. Нет ничего, что можно сделать об этом: обе фиксации являются одним шагом вперед! Если Вы тогда запускаете с получающейся фиксации и делаете другой шаг, Вы теперь посвящаете себя, какой бы ни соединяют Вас каналом, запустился на.
средство исправления для этого должно постараться не продвигаться на один шаг за один раз и быть заблокированным в зависимые от предшествующего пути развития цепочки. Вместо этого если Вы планируете посетить всю цепочку пути родословной, прежде, чем сделать что-либо еще , составьте полный список всех фиксаций в цепочке:
git rev-list --topo-order --reverse --ancestry-path A..B > /tmp/list-of-commits
Затем посетите каждую фиксацию в этом списке, по одному, и Вы получите всю цепочку. Эти --topo-order
удостоверится, что Вы совершаете нападки I
- и J
в том порядке, и K
- и L
в том порядке (хотя нет никакого простого способа предсказать, сделаете ли Вы пару I-J прежде или после пары K-L).
Каждый коммит хранит указатель на своего родителя (родителей, в случае слияния (стандартного) коммита).
Итак, нет способа указать на дочернюю фиксацию (если она есть) от родителя.
Создатель Hudson (теперь Jenkins) Kohsuke Kawaguchi , только что опубликованный (ноябрь 2013 г.):
kohsuke / git-children- of :
Для данного коммита найти непосредственных потомков этого коммита.
#!/bin/bash -e
# given a commit, find immediate children of that commit.
for arg in "$@"; do
for commit in $(git rev-parse $arg^0); do
for child in $(git log --format='%H %P' --all | grep -F " $commit" | cut -f1 -d' '); do
git describe $child
done
done
done
Как показано в этой ветке , в VCS на основе истории, представленной DAG (направленный ациклический график) , нет «одного родителя» или «одного дочернего элемента».
C1 -> C2 -> C3
/ \
A -> B E -> F
\ /
D1 -> D2 ----/
Упорядочивание коммитов осуществляется по «топо-порядку» или «по дате» (см. книгу GitPro )
Но поскольку Git1.6.0 , вы можете перечислить дети коммита.
git rev-list --children
git log --children
Примечание: для родительских коммитов возникает та же проблема с суффиксом ^
в параметре редакции, означающим первый родительский объект этого объекта фиксации. ^
означает
-й родительский объект (т.е. rev ^
эквивалентен rev ^ 1
).
Если вы находитесь в ветке foo
и выполняете команду « git merge bar
», то foo
будет первым родительским элементом.
То есть: первый родительский элемент - это ветка, в которой вы были при слиянии, а второй - фиксация ветки, в которую вы слились.
Есть нет уникального "следующего коммита". Поскольку история в Git - это группа DAG, а не строка, многие коммиты могут иметь общего родителя (ветки), а коммиты могут иметь более одного родителя (слияния).
Если вы имеете в виду конкретную ветку, вы можете посмотреть ее журнал и увидеть, какой коммит перечисляет текущую ветку в качестве ее родительской.
Если все дочерние коммиты находятся в некоторой ветке, вы можете использовать gitk --all commit ^ ..
, где "commit" что-то идентифицирующее фиксацию. Например, если сокращенный SHA-1 коммита - c6661c5, введите gitk --all c6661c5 ^ ..
Вам, вероятно, потребуется ввести полный SHA-1 в ячейку gitk «SHA1 ID:». Вам понадобится полный SHA-1, который в этом примере можно получить с помощью git rev-parse c6661c5
В качестве альтернативы git rev-list --all --children | grep '^ c6661c5883bb53d400ce160a5897610ecedbdc9d'
создаст строку, содержащую всех дочерних элементов этого коммита, предположительно независимо от того, есть ли ветвь.