【问题标题】:I want to run a group by query after I get a result of a query我想在得到查询结果后按查询运行一个组
【发布时间】:2020-07-25 23:03:33
【问题描述】:

我对SQL有基本的了解,(不擅长JOINS), 所以这是我正在编写一个脚本的交易,我想在其中获取最近交易状态的总数。

即在一天结束时,状态计数是多少,有多少购买、出售、支付等。

例如:

transaction_reference  status   time_stamp
123av                   buy     2020-07-23 06:06:17
123av                   sell    2020-07-23 06:06:18
124av                   buy     2020-07-23 06:06:23
124av                   sell    2020-07-23 06:06:38
125cv                   buy     2020-07-23 06:06:24
125av                   buy     2020-07-23 06:06:14
125ad                   paid     2020-07-23 06:06:14

我有一个查询来获取每笔交易的最后状态,

SELECT
  count(DISTINCT transaction_reference),transaction_reference, MAX(time_stamp),status
FROM
  transactiontable
WHERE
    time_stamp >= '2020-07-23 06:00:00' and time_stamp <= '2020-07-23 16:00:00'
GROUP BY
transaction_reference;

因此我得到的结果如下:

transaction_reference  status   time_stamp
123av                   sell    2020-07-23 06:06:18
124av                   sell    2020-07-23 06:06:38
125cv                   buy     2020-07-23 06:06:24
125av                   buy     2020-07-23 06:06:14
125ad                   paid    2020-07-23 06:06:14

此结果为我提供了每个 transaction_reference 的最新状态, 现在我想计算状态, *status 除了买入和卖出之外,还有其他价值。

这是所需的输出:

状态计数 买 2 卖 3 支付 1

由于我在“JOIN”方面很弱, 我的第一个解决方案是将其放入临时表中,然后按命令运行组。

其他是使用内连接。

如果这可以通过使用连接来完成,谁能告诉我怎么做?

或者简单来说,我可以在查询上运行查询,

喜欢

Select count(*),C from table1
where
(select * from table1 where a='12')
group by C;

【问题讨论】:

  • 您的第一个查询已损坏。 selectgroup by 在他们选择的列中不一致。
  • @GordonLinoff 我认为 mysql 在这种情况下只是自动最大值
  • @Hogan。 . .实际上,它没有,并且被记录为危险。您对 SQLite 的看法是正确的——尽管那里也应该避免这种结构。
  • 嗨,这不是坏的,
  • @GordonLinoff -- 我并没有为它辩护 -- 很明显,它让这个用户做这种类型的构造增加了他们的困惑

标签: mysql sql


【解决方案1】:

也可以按状态分组...像这样:

SELECT
  count(*), transaction_reference, MAX(time_stamp),status
FROM
  dxl_payment.BARCLAYS_TRANSACTION 
WHERE
    time_stamp >= '2020-07-23 06:00:00' and time_stamp <= '2020-07-23 16:00:00'
GROUP BY transaction_reference, status

现在您将获得每种状态类型的一行以及这些类型的计数

要获得每个状态的计数,请执行以下操作:

SELECT
  count(*), status
FROM
  dxl_payment.BARCLAYS_TRANSACTION 
WHERE
    time_stamp >= '2020-07-23 06:00:00' and time_stamp <= '2020-07-23 16:00:00'
GROUP BY status

基于另一个组获得计数的模式是使用 sum -- 像这样:

SELECT
  count(DISTINCT transaction_reference),transaction_reference, MAX(time_stamp)
  sum(case when status='a' then 1 else 0 end) as count_a_status,
  sum(case when status='b' then 1 else 0 end) as count_b_status,
  sum(case when status='c' then 1 else 0 end) as count_c_status
 
FROM
  transactiontable
WHERE
    time_stamp >= '2020-07-23 06:00:00' and time_stamp <= '2020-07-23 16:00:00'
GROUP BY
transaction_reference;

【讨论】:

  • 嗨,我相信这将与我的查询相同,因为一旦我输入 max(time_stamp),每个事务的计数现在只有 1。
  • @AdityaKumar -- 见上文我更改了 count 语句以获得有意义的结果
  • 这会给我每个 transaction_reference wrt 状态的计数。
  • 这不是你想要的@AdityaKumar吗?
  • 不,我想要每个状态的总数。因为,我的每笔交易都可以有多个状态,所以我之前的查询提供了每笔交易的最新状态。现在我想计算销售、购买、支付的总数。
【解决方案2】:

您可以使用时间比较和相关子查询获取每天的最后状态:

SELECT bt.*
FROM dxl_payment.BARCLAYS_TRANSACTION bt
WHERE bt.time_stamp = (SELECT MAX(bt2.time_stamp)
                       FROM dxl_payment.BARCLAYS_TRANSACTION bt2
                       WHERE bt2.transaction_reference = bt.transaction_reference AND
                             DATE(bt2.time_stamp) = DATE(bt.time_stamp)
                      ) AND
      bt.time_stamp >= '2020-07-23 06:00:00' AND
      bt.time_stamp <= '2020-07-23 16:00:00'

要获得状态的分布,聚合:

SELECT bt.status, COUNT(*)
FROM dxl_payment.BARCLAYS_TRANSACTION bt
WHERE bt.time_stamp = (SELECT MAX(bt2.time_stamp)
                       FROM dxl_payment.BARCLAYS_TRANSACTION bt2
                       WHERE bt2.transaction_reference = bt.transaction_reference AND
                             DATE(bt2.time_stamp) = DATE(bt.time_stamp) AND
                             bt2.time_stamp >= '2020-07-23 06:00:00' AND
                             bt2.time_stamp <= '2020-07-23 16:00:00'
                      ) AND
      bt.time_stamp >= '2020-07-23 06:00:00' AND
      bt.time_stamp <= '2020-07-23 16:00:00'
GROUP BY bt.status;

为了提高性能,您需要在BARCLAYS_TRANSACTION(transaction_reference, time_stamp) 上建立索引。

【讨论】:

  • 这个超时了!
  • @AdityaKumar 。 . . .在子查询中适当的索引和过滤都会有所帮助。我更新了答案。
  • 在我的服务器上花费了很多时间,30 秒后超时
【解决方案3】:

重复使用您的查询:

SELECT
  count(DISTINCT transaction_reference),transaction_reference, MAX(time_stamp),status
FROM
  transactiontable
WHERE
    time_stamp >= '2020-07-23 06:00:00' and time_stamp <= '2020-07-23 16:00:00'
GROUP BY
transaction_reference;

它将被包装如下:

select
  /* remove DISTINCT below to get pure count/total */
  count(DISTINCT status) as status_count,
  sum(case when status = 'buy' then 1 else 0 end) as buy,
  sum(case when status = 'sell' then 1 else 0 end) as sell,
  sum(case when status = 'paid' then 1 else 0 end) as paid
from (
  SELECT
    count(DISTINCT transaction_reference),transaction_reference, MAX(time_stamp),status
  FROM
    transactiontable
  WHERE
      time_stamp >= '2020-07-23 06:00:00' and time_stamp <= '2020-07-23 16:00:00'
  GROUP BY
  transaction_reference
) your_query;

【讨论】:

    【解决方案4】:

    所以我花了 2 小时学习 JOINS,然后就可以了, 这是 100% 的工作。

    记录是否有人会觉得这很有帮助。

    select count(distinct a.transaction_reference),a.status from transactiontable as a ,
    (
    SELECT
      count(DISTINCT transaction_reference),transaction_reference, MAX(time_stamp) as time_stamp,status
    FROM
       transactiontable
    WHERE
        time_stamp >= '2020-07-24 16:00:00' and time_stamp <= '2020-07-25 16:00:00'
    GROUP BY
    transaction_reference) as b where a.transaction_reference=b.transaction_reference  and  a.time_stamp=b.time_stamp 
    group by a.status;
    

    这是给我的确切数字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-23
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 2014-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多