問題:
PostgreSQLデータベースで月ごとにレコードをグループ化したいと考えています。
例:
私たちのデータベースには、watch id列にデータがあります 、name 、およびproduction_timestamp 。
| id | 名前 | Production_timestamp |
|---|---|---|
| 1 | 見る | 2019-03-01 11:45:23 |
| 2 | スマートウォッチ | 2019-09-15 07:35:13 |
| 3 | スマートバンド | 2019-09-22 17:22:05 |
解決策:
DATE_TRUNC()を使用できます テーブル内のレコードを月ごとにグループ化する関数。
作成するクエリは次のとおりです。
SELECT
DATE_TRUNC('month',production_timestamp)
AS production_to_month,
COUNT(id) AS count
FROM watch
GROUP BY DATE_TRUNC('month',production_timestamp);
クエリの結果は次のとおりです。
| product_to_month | カウント |
|---|---|
| 2019-03-01 00:00:00 | 1 |
| 2019-09-01 00:00:00 | 2 |
ディスカッション:
DATE_TRUNC()を使用します PostgreSQLデータベースから特定の精度で日付または時刻を取得する場合に機能します。 (この例では、月の精度を使用しました。)
この関数は2つの引数を取ります。まず、日付部分指定子(この例では「月」)があります。指定子は文字列であり、引用符で囲む必要があることに注意してください。
2番目の引数はタイムスタンプ値です。これは、タイムスタンプ値またはタイムスタンプ列の名前を返す式にすることができます。 (この例では、列production_timestampを使用します )。
関数DATE_TRUNC() タイムスタンプを指定された精度(この場合は月)に切り捨てます。私たちのデータベースでは、スマートウォッチ 製造日は2019-09-15 07:35:13;月の精度に切り捨てられると、2019-09-01 00:00:00になります。 。月レベルの精度により、日は「01」として表示され、時刻はゼロで埋められます。 (タイムスタンプの切り捨てられた日付部分(日、月など)は1に置き換えられます。)
PostgreSQLでは、レコードを月ごとにグループ化するのが非常に一般的です。この例では、製品の数は月ごとに合計されます。 (COUNT() 集計関数は製品の数をカウントします)。集計関数を使用してレコードをグループ化する場合は、GROUPBY句を使用する必要があります。 GROUP BY句の後に、集計関数で使用される列または式をSELECTステートメントに配置する必要があります。 (この例では、これはD ATE_TRUNC( 'month', production_timestamp) 。)
もちろん、DATE_TRUNC()を使用する必要はありません。 レコードをグループ化するためだけに機能します。また、これを使用して、特定の日付の月の最初の日を取得することもできます。
時計ごとに、名前と製造日から月までの精度を取得しましょう。グループ化は必要ありません。作成するクエリは次のとおりです。
SELECT name,
DATE_TRUNC('month',production_timestamp)
AS production_to_month
FROM watch;
結果は次のとおりです。
| name | product_to_month |
|---|---|
| ウォッチ | 2019-03-01 00:00:00 |
| スマートウォッチ | 2019-09-01 00:00:00 |
| スマートバンド | 2019-09-01 00:00:00 |
このクエリでは、関数DATE_TRUNC() タイムスタンプを月の精度に切り捨てます。私たちのデータベースでは、スマートウォッチ 製造日は'2019-09-15 07:35:13';今は'2019-09-01 00:00:00' 、月の最初の日です。