我想知道是否有更好的方法从 c1 列获取 max,然后从 c2 列获取所选行的 max
SELECT MAX(c1) , MAX(c2) FROM t GROUP BY c1 HAVING c1 = MAX(c1)
Run Code Online (Sandbox Code Playgroud) pct_<original_name>_valid我想计算每个输入列的非缺失值的百分比。在此示例中只有 2 列,因此可以轻松手动编写下面的代码。但是当有 30 多个列时,我不想手动执行此操作。甚至可以动态地执行此操作吗?(例如,将列名称列表作为输入)
import pyspark.sql.functions as F
d = [{'name': 'Alice', 'age': 1}, {'name': 'Bae', 'age': None}]
df = spark.createDataFrame(d)
df.withColumn('name_valid', F.when(col("name").isNotNull(),1).otherwise(0))\
.withColumn('age_valid', F.when(col("age").isNotNull(),1).otherwise(0))\
.agg(
(100.0*F.sum(col("name_valid"))/F.count(F.lit(1))).alias("pct_name_valid"),
(100.0*F.sum(col("age_valid"))/F.count(F.lit(1))).alias("pct_age_valid")
)\
.show()
Run Code Online (Sandbox Code Playgroud)
结果如下:
+--------------+-------------+
|pct_name_valid|pct_age_valid|
+--------------+-------------+
| 100.0| 50.0|
+--------------+-------------+
Run Code Online (Sandbox Code Playgroud)
如前所述,我不想对所有 30 多个列手动执行此操作。有什么办法我可以这样做:
my_output = calculate_non_missing_percentage(df, my_columns = ["name", "age", "gender", "school", "color"])
Run Code Online (Sandbox Code Playgroud) 我使用的是 PostgreSQL 10.4,由 Visual C++ build 1800,64 位编译;
下面的查询产生一个 1 列的结果集,类型为 JSON 和多行,我要求查询将每一行返回到一个数组(基本上是 1 行和 1 列)中,例如 json_agg()。
不幸的是,如果我将 json_agg() 放在 json_build_object 周围,我会收到一个错误,这是不可能的:
ERROR: aggregate function calls cannot be nested
LINE 28: '$values', json_agg(fv.*)
Run Code Online (Sandbox Code Playgroud)
SELECT json_build_object(
'id', vl.id,
'id_form', vl.id_form,
'id_waardenlijst', vl.id_waardenlijst,
'$values', json_agg(fv.*)
) FROM var_list vl
LEFT JOIN testscheme.form_values fv
on fv.id_form_record = vl.id
GROUP BY vl.id, vl.id_form, vl.id_waardenlijst
Run Code Online (Sandbox Code Playgroud)
如何添加另一层聚合,返回 1 列和 1 行以及我想要的对象数组?
我希望我很清楚!
考虑下表,其中一列有 10 条记录。我不明白如何
SUM(1) gives output 10
SUM(2) gives output 20
SUM(3) gives output 30
create table test_a4(idCol numeric);
insert into test_a4(idCol) values (1),(2), (3), (4), (5) , (6), (7), (8), (9) , (10)
Select SUM(1) FROM test_a4 -- SUM(1) gives output 10
Select SUM(2) FROM test_a4 -- SUM(2) gives output 20
Select SUM(3) FROM test_a4 -- SUM(3) gives output 30
Run Code Online (Sandbox Code Playgroud) 我需要计算订单中所有项目的总金额,我使用了STRING_AGG()但输出将金额划分为多行。
这是 SELECT 语句:
SELECT b.order_id as 'Order Id',
string_agg(e.testname,CHAR(13)) as 'Test',
string_agg(d.PRICE,CHAR(13)) as 'Price',
string_agg(d.test_vat,CHAR(13)) as '15% Vat',
sum(convert(float,d.TOTAL_AMOUNT)) as 'Total'
FROM patients a , lab_orders b ,customers c , order_details d , labtests e
where a.patient_no = b.patient_no
and b.custid = c.custid
and b.order_id = d.order_id
and d.testid = e.testid
and b.ORDER_ID=2000000272
group by b.order_id , d.TOTAL_AMOUNT
Run Code Online (Sandbox Code Playgroud)
输出 :
Order Id Test Price 15% Vat Total
2000000272 (TSH) Free T3 (FT3) Free T4 (FT4) 90 90 …Run Code Online (Sandbox Code Playgroud) 我读过的大多数文档都表明,CROSS APPLY 的行为方式与 INNER JOIN 类似,只有在两个源表中都有匹配的行时,行才会包含在输出中。
然而,情况似乎并不总是如此,例如,如果您运行以下 SQL 查询,结果将包含 3 行,其中一行包含许多 NULL,因为右侧表中没有行:
CREATE TABLE #Order
(
Id int PRIMARY KEY
)
CREATE TABLE #OrderItem
(
OrderId int NOT NULL,
Price decimal(18, 2) NOT NULL
)
INSERT INTO #Order
VALUES(1), (2), (3)
INSERT INTO #OrderItem
VALUES(1, 10), (1, 20), (3,100)
SELECT *
FROM #Order o
CROSS APPLY
(
SELECT SUM(Price) AS TotalPrice, COUNT(*) AS Items, MIN(Price) AS MinPrice
FROM #OrderItem
WHERE OrderId = o.Id
) t
DROP TABLE #Order
DROP TABLE …Run Code Online (Sandbox Code Playgroud) 我有一个TableA有两列的表:MyName nvarchar(100)和MyDateTime DateTime.每个MyName具有不同DateTimes的记录可以有多个.我试图返回一个记录集,其中包含MyName表中的每个值,每个值最早MyDateTime.
这可以返回不同的MyNames:
SELECT DISTINCT([MyName]) FROM TableA
Run Code Online (Sandbox Code Playgroud)
我尝试了不同的UNION语句,但我的所有尝试都被DISTINCT()关键字抛弃了.例如,以下查询会查找所有时间,而不仅仅是每个时间的最小值:
SELECT DISTINCT([MyName]), [MyDateTime] FROM TableA
Run Code Online (Sandbox Code Playgroud)
努力想出正确的SQL语法来实现这一目标.有什么帮助吗?
以下是我必须使用的示例.
样本数据 :
ID RANK
---------
1 2
1 3
2 4
2 1
3 2
2 3
4 2
Run Code Online (Sandbox Code Playgroud)
我试图与像行合并IDS和sum在RANK这些小号IDs转换为单排:
ID SUM(rank)
1 5
2 8
3 2
4 2
Run Code Online (Sandbox Code Playgroud) 我只需要从城市中获取唯一的名称:
table: cities
+----+--------+
| id | name |
+----+--------+
| 1 | Rawal |
+----+--------+
| 2 | Nina |
+----+--------+
| 3 | Monte |
+----+--------+
| 4 | Nina |
+----+--------+
| 5 | Samina |
+----+--------+
Run Code Online (Sandbox Code Playgroud)
我只需要获得独特的名字,例如Rawal,Monte和Samina.
SELECT DISTINCT name FROM cities
Run Code Online (Sandbox Code Playgroud)
还给出了Nina我不需要的东西.
我的表中有两列。Column1包含日期时间条目,而 Column2 包含营养条目。有多个营养条目属于同一日期,例如:

如何获得每天的营养价值总和?
例如,对于 4/17/2017,我想要的值为 9,对于 4/18/2017,它应该为 3。
我在数据库作业中遇到这个问题并需要回答这个问题:
哪位员工对购买次数最多的客户的销售额最高?
这些是我尝试编写这个查询
--select Customers.Firstname,Products.Name,Sales.Quantity from Customers
--inner join Sales
--on Customers.CustomerId=Sales.CustomerId
--inner join Products
--on Sales.productId=Products.ProductId
--where Products.Name like 'Mobile'
--Select Customers.CustomerId,max(COUNT(Customers.CustomerId)) As Customecount,Emploees.EmploeeId,max(COUNT(Emploees.EmploeeId))as EmploeeeCount from Emploees
--inner join Sales
--on Emploees.EmploeeId=Sales.EmploeeId
--inner join Customers
--on Customers.CustomerId=Sales.CustomerId
--group by Customers.CustomerId,Emploees.EmploeeId ,Count(Sales.productId)as productCount,Count(Emploees.EmploeeId)as emploeeCount,Count(Customers.CustomerId)as customerCount
select * from
(select Distinct Customers.CustomerId,Sales.productId,COUNT(Sales.productId)as CountProduct from Customers
inner join Sales
on Customers.CustomerId=Sales.CustomerId
inner join Emploees
on Emploees.EmploeeId=Sales.EmploeeId
group by Sales.productId,Emploees.EmploeeId,Customers.CustomerId,Sales.productId) as Result
--gr
Run Code Online (Sandbox Code Playgroud)
但这些都不起作用
请帮我写这个查询。
sql ×10
sql-server ×5
group-by ×2
mysql ×2
t-sql ×2
arrays ×1
cross-apply ×1
inner-join ×1
json ×1
oracle ×1
postgresql ×1
pyspark ×1
string ×1
sum ×1