【问题标题】:Get total count and first 3 columns获取总数和前 3 列
【发布时间】:2020-01-17 18:13:45
【问题描述】:

我有以下 SQL 查询:

SELECT TOP 3 accounts.username
    ,COUNT(accounts.username) AS count
FROM relationships
JOIN accounts ON relationships.account = accounts.id
WHERE relationships.following = 4
    AND relationships.account IN (
        SELECT relationships.following
        FROM relationships
        WHERE relationships.account = 8
        );

我想返回accounts.username 和前3 个accounts.username 的总数(没有特别的顺序)。不幸的是accounts.usernameCOUNT(accounts.username) 不能共存。该查询可以很好地删除其中一个。我不想使用不同的选择主体两次发送请求。计数列可以跨越到 1000+,所以我更愿意在 SQL 中而不是在代码中计算它。

当前查询返回错误Column 'accounts.username' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.,它没有带我到任何地方,这与其他问题不同,因为我不想使用“分组依据”子句。有没有办法用FOR JSON AUTO 做到这一点?

所需的输出可能是:

+-------+----------+
| count | username |
+-------+----------+
| 1551  | simon1   |
| 1551  | simon2   |
| 1551  | simon3   |
+-------+----------+

+----------------------------------------------------------------+
| JSON_F52E2B61-18A1-11d1-B105-00805F49916B                      |
+----------------------------------------------------------------+
| [{"count": 1551, "usernames": ["simon1", "simon2", "simon3"]}] |
+----------------------------------------------------------------+

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:

如果您想在结果集中的附加列中显示满足过滤条件的总行数(并且username 不为空),那么您可以使用窗口函数:

SELECT TOP 3
    a.username,
    COUNT(a.username) OVER() AS cnt
FROM relationships r
JOIN accounts a ON r.account = a.id
WHERE 
    r.following = 4
    AND EXISTS (
        SELECT 1 FROM relationships t1 WHERE r1.account = 8 AND r1.following = r.account
    )
;

旁注:

  • 如果username 不可为空,请使用COUNT(*) 而不是COUNT(a.username):这样效率更高,因为它不需要数据库检查每个值是否为空
  • 表别名使查询更易于编写、读取和维护
  • 我通常更喜欢 EXISTS 而不是 IN(但这主要是个人喜好问题,因为这两种技术都应该适合您的用例)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多