Для этого вам понадобится 0.11 (0.11rc1 отсутствует, окончательная ошибка на следующей неделе)
In [9]: df = DataFrame([ Timestamp('20010101'), Timestamp('20040601') ])
In [10]: df
Out[10]:
0
0 2001-01-01 00:00:00
1 2004-06-01 00:00:00
In [11]: df = DataFrame([ Timestamp('20010101'),
Timestamp('20040601') ],columns=['age'])
In [12]: df
Out[12]:
age
0 2001-01-01 00:00:00
1 2004-06-01 00:00:00
In [13]: df['today'] = Timestamp('20130419')
In [14]: df['diff'] = df['today']-df['age']
In [16]: df['years'] = df['diff'].apply(lambda x: float(x.item().days)/365)
In [17]: df
Out[17]:
age today diff years
0 2001-01-01 00:00:00 2013-04-19 00:00:00 4491 days, 00:00:00 12.304110
1 2004-06-01 00:00:00 2013-04-19 00:00:00 3244 days, 00:00:00 8.887671
Вам нужно, чтобы этот нечетный пример применялся в конце, потому что еще не полная поддержка сканеров timedelta64 [ns] (например, как мы используем Timestamps сейчас для datetime64 [ns], начиная с 0.12)
Вы можете использовать GROUP_CONCAT
:
SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies GROUP BY person_id
Как сказал Людвиг в в своем комментарии, , вы можете добавить оператор DISTINCT
в избегайте дубликатов:
SELECT person_id, GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ')
FROM peoples_hobbies GROUP BY person_id
Как указано в в комментарии к , , вы также можете сортировать значения перед их использованием с помощью ORDER BY
:
SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ')
FROM peoples_hobbies GROUP BY person_id
Как сказал Даг в его комментарий, , на результат будет 1024 байта. Чтобы решить эту проблему, запустите этот запрос перед запросом:
SET group_concat_max_len = 2048
Конечно, вы можете изменить 2048
в соответствии с вашими потребностями. Чтобы вычислить и присвоить значение:
SET group_concat_max_len = CAST(
(SELECT SUM(LENGTH(hobbies)) + COUNT(*) * LENGTH(', ')
FROM peoples_hobbies GROUP BY person_id)
AS UNSIGNED
)
ПРЕДУПРЕЖДЕНИЕ: Эта запись сделает вас голодными.
Я обнаружил, что хочу выбрать несколько отдельных строк вместо группы и конкатенатировать в определенном поле.
Предположим, у вас есть таблица идентификаторов продуктов и их имена и цены:
+------------+--------------------+-------+
| product_id | name | price |
+------------+--------------------+-------+
| 13 | Double Double | 5 |
| 14 | Neapolitan Shake | 2 |
| 15 | Animal Style Fries | 3 |
| 16 | Root Beer | 2 |
| 17 | Lame T-Shirt | 15 |
+------------+--------------------+-------+
Затем у вас есть ajax fancy-schmancy, который перечисляет эти щенки как флажки.
Пользователь вашего голодного бегемота выбирает 13, 15, 16
. Нет десерта для нее сегодня ...
Способ суммирования порядка вашего пользователя в одной строке с чистым mysql.
Используйте GROUP_CONCAT
с предложением IN
:
mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary FROM product WHERE product_id IN (13, 15, 16);
Какие выходы:
+------------------------------------------------+
| order_summary |
+------------------------------------------------+
| Double Double + Animal Style Fries + Root Beer |
+------------------------------------------------+
Если вы хотите получить общую цену, перейдите в SUM()
:
mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary, SUM(price) AS total FROM product WHERE product_id IN (13, 15, 16);
+------------------------------------------------+-------+
| order_summary | total |
+------------------------------------------------+-------+
| Double Double + Animal Style Fries + Root Beer | 10 |
+------------------------------------------------+-------+
PS: Извините, если у вас нет In-N-Out рядом ...
У меня был более сложный запрос, и я обнаружил, что мне пришлось использовать GROUP_CONCAT
во внешнем запросе, чтобы заставить его работать:
SELECT DISTINCT userID
FROM event GROUP BY userID
HAVING count(distinct(cohort))=2);
SELECT GROUP_CONCAT(sub.userID SEPARATOR ', ')
FROM (SELECT DISTINCT userID FROM event
GROUP BY userID HAVING count(distinct(cohort))=2) as sub;
Надеюсь, это может помочь кому-то.
В моем случае у меня была строка Ids, и ее нужно было передать на char, иначе результат был закодирован в двоичный формат:
SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table
Вы можете изменить максимальную длину значения GROUP_CONCAT
, установив параметр group_concat_max_len
.
Подробнее см. в документации по MySQL .
Попробуйте следующее:
DECLARE @Hobbies NVARCHAR(200) = ' '
SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;
Посмотрите на GROUP_CONCAT
, если ваша версия MySQL (4.1) поддерживает его. Подробнее см. В документации .
Это будет выглядеть примерно так:
SELECT GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
WHERE person_id = 5
GROUP BY 'all';
group by 'all'
не является необходимым (к тому же нежелательным), потому что он присваивает всем строкам строку all
, а затем сравнивает строки между этими строками. Я прав?
– Krzysiek
19 October 2014 в 19:43
Используйте переменную сеанса MySQL (5.6.13) и оператор присваивания, такой как следующий
SELECT @logmsg := CONCAT_ws(',',@logmsg,items) FROM temp_SplitFields a;
, тогда вы можете получить
test1,test11
SELECT @logmsg := CONCAT_ws(',',@logmsg,description) from test
– Jan
8 March 2017 в 16:31
Функция GROUP Aggregate, GROUP_CONCAT .
DISTINCT
, вы не получите никаких удвоений.... GROUP_CONCAT(DISTINCT hobbies)
– Ludwig 18 June 2012 в 15:39SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ') FROM peoples_hobbies GROUP BY person_id
– Jan 8 March 2017 в 16:38