繁体   English   中英

(SQL)您如何 select 一个最大浮点值以及查询中的其他数据类型值?

[英](SQL) How do you select a max float value along with other datatypes values within a query?

我正在使用 Iowa Liquor Sales 数据集,在本例中称为“bigquery-public-data.iowa_liquor_sales.sales”。 相关列及其数据类型为 date(DATE)、sale_dollars(FLOAT)、item_description(STRING)、store_name(STRING)。

我正在尝试编写一个查询,该查询将返回过去三年(2021、2020、2019)中每年的最高销售额以及日期、item_description 和 store_name。

以下代码有效,但仅涵盖一年。 我知道我每次都可以复制+粘贴并更改日期,但这似乎很乏味。 有没有更好的办法?

SELECT date, sale_dollars, item_description, store_name
FROM `bigquery-public-data.iowa_liquor_sales.sales`
WHERE date between '2021-01-01' and '2021-12-31'
ORDER BY sale_dollars DESC
LIMIT 1
日期 sale_dollars 商品描述 商店名称
2021-04-19 250932.0 铁托斯手工伏特加 海维 #3

在尝试不同的方式来编写它以使 2019、2020 和 2021 年的最大销售额连同它们的日期、item_description 和 store_name 一起返回时,我遇到了错误。 下面是我得到的最接近的(缺少日期、item_description 和 store_name)。

SELECT

(SELECT MAX(sale_dollars)
FROM `bigquery-public-data.iowa_liquor_sales.sales`
WHERE date between '2021-01-01' and '2021-12-31') as sale_2021,

(SELECT MAX(sale_dollars)
FROM `bigquery-public-data.iowa_liquor_sales.sales`
WHERE date between '2020-01-01' and '2020-12-31') as sale_2020,

(SELECT MAX(sale_dollars)
FROM `bigquery-public-data.iowa_liquor_sales.sales`
WHERE date between '2019-01-01' and '2019-12-31') as sale_2019

如何编写一个查询来返回过去三年的最大销售额以及日期、商品和商店名称?

由于三个值只传递一个值,您可以将它们添加到第一个查询中,仅适用于三年

SELECT 
    date, sale_dollars, item_description, store_name,
    (SELECT MAX(sale_dollars)
    FROM `bigquery-public-data.iowa_liquor_sales.sales`
    WHERE date between '2021-01-01' and '2021-12-31') as sale_2021,    
    (SELECT MAX(sale_dollars)
    FROM `bigquery-public-data.iowa_liquor_sales.sales`
    WHERE date between '2020-01-01' and '2020-12-31') as sale_2020,    
    (SELECT MAX(sale_dollars)
    FROM `bigquery-public-data.iowa_liquor_sales.sales`
    WHERE date between '2019-01-01' and '2019-12-31') as sale_2019
FROM `bigquery-public-data.iowa_liquor_sales.sales`
WHERE date between '2019-01-01' and '2021-12-31'
ORDER BY sale_dollars DESC
LIMIT 1

考虑以下查询

SELECT EXTRACT(YEAR FROM date) year, 
       ARRAY_AGG(
         STRUCT(date, sale_dollars, item_description, store_name) 
         ORDER BY sale_dollars DESC LIMIT 1
       )[OFFSET(0)].*
  FROM `bigquery-public-data.iowa_liquor_sales.sales`
 WHERE date BETWEEN '2019-01-01' AND '2021-12-31'
 GROUP BY 1;
查询结果
+------+------------+--------------+----------------------+-------------------------------+
| year |    date    | sale_dollars |   item_description   |          store_name           |
+------+------------+--------------+----------------------+-------------------------------+
| 2020 | 2020-10-08 |     250932.0 | Titos Handmade Vodka | Hy-Vee #3 / BDI / Des Moines  |
| 2019 | 2019-10-08 |      78435.0 | Makers Mark          | Hy-Vee Food Store / Urbandale |
| 2021 | 2021-07-05 |     250932.0 | Titos Handmade Vodka | Hy-Vee #3 / BDI / Des Moines  |
+------+------------+--------------+----------------------+-------------------------------+

或者,您可以使用 window function 获得相同的结果

 SELECT date, sale_dollars, item_description, store_name
   FROM `bigquery-public-data.iowa_liquor_sales.sales`
  WHERE date BETWEEN '2019-01-01' AND '2021-12-31'
QUALIFY ROW_NUMBER() OVER (
          PARTITION BY EXTRACT(YEAR FROM date) ORDER BY sale_dollars DESC
        ) = 1;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM