在SQL Server中按问题分组,从MySQL迁移

无法找到我的问题的解决方案,希望您的帮助。

~~帖子已被编辑,只有一个问题~~-

在选择多列时按一个查询分组。 在MySQL中,您可以按需要随意分组,它仍然会选择所有它们,因此,例如,如果我想选择最新的100个交易,按电子邮件分组(仅获取单个电子邮件的最后一个交易) )

在MySQL中,我会这样做:

SELECT * FROM db.transactionlog
group by Email
order by TransactionLogId desc
LIMIT 100;

SQL Server中这是不可能的,建议使用谷歌搜索一点点来指定我要使用汇总的每一列,这样不会造成值的混合(在分组的行之间混合列) ?

例如:

SELECT TOP(100)
   Email,MAX(ResultCode) as 'ResultCode',MAX(Amount) as 'Amount',MAX(TransactionLogId) as 'TransactionLogId'
  FROM [db].[dbo].[transactionlog]

  group by Email
  order by TransactionLogId desc

TransactionLogIdprimarykey,它是identity,由其排序以实现最后插入。 只是想知道我将进行此类查询的ResultCodeAmount将是最后插入的行,而不是分组行或w / e中的最高行。

〜编辑〜 样本数据-

第1行:

Email : test@email.com
ResultCode : 100
Amount : 27
TransactionLogId : 1

第2行:

Email: test@email.com
ResultCode:50
Amount: 10
TransactionLogId: 2

使用上面的示例数据,我的目标是获取的行详细信息 TransactionLogId = 2。 但是实际发生的是,我得到了两者的混合值,就像我获得transactionLogId = 2一样,但是得到了第一行的结果代码和数量。 我该如何避免?

谢谢。

boh333 回答:在SQL Server中按问题分组,从MySQL迁移

您应该首先通过每封电子邮件找出哪个是最新的交易日志,然后针对同一表重新加入以检索完整记录:

;WITH MaxTransactionByEmail AS
(
    SELECT
        Email,MAX(TransactionLogId) as LatestTransactionLogId
    FROM 
        [db].[dbo].[transactionlog]
    group by 
        Email
)
SELECT
    T.*
FROM
    [db].[dbo].[transactionlog] AS T
    INNER JOIN MaxTransactionByEmail AS M ON T.TransactionLogId = M.LatestTransactionLogId

由于诸如MAX()之类的聚合函数正在考虑与Email的特定值相对应的所有行,因此您当前正在获得混合结果。因此,即使事务日志ID较低,MAX()列与Amount之间的10列的27值为27

另一种解决方案是使用ROW_NUMBER()窗口函数按每个Email进行行排名,然后仅选择第一行:

;WITH TransactionsRanking AS
(
    SELECT
        T.*,MostRecentTransactionLogRanking = ROW_NUMBER() OVER (
            PARTITION BY 
                T.Email                     -- Start a different ranking for each different value of Email
            ORDER BY 
                T.TransactionLogId DESC)    -- Order the rows by the TransactionLogID descending
    FROM 
        [db].[dbo].[transactionlog] AS T
)
SELECT
    T.*
FROM
    TransactionsRanking AS T
WHERE
    T.MostRecentTransactionLogRanking = 1
本文链接:https://www.f2er.com/3029757.html

大家都在问