【问题标题】:SQL query using cast/convert in group by使用分组转换/转换的 SQL 查询
【发布时间】:2014-11-26 09:48:25
【问题描述】:

我最近正在编写一个查询,我必须将时间戳转换为日期,然后对转换后的日期执行聚合。因此,一种简单的方法是使用 group by 中的转换公式(与创建列时相同),它确实有效。

但是,它似乎并不是最优化的方式。我能感觉到性能在恶化。有没有更好的方法?

查询正在使用视图,其结构如下:

SELECT  ORG ,
        CONVERT(DATE, CREATION_DATE, 101) ,
        SKU_CODE ,
        SKU_NAME ,
        COUNT(UNIT) AS Production
FROM    dbo.abcd_efgh_ijk(123, 'abc', NULL, '10009', NULL,
                          '2014-11-01 00:00:00', '2014-11-30 23:59:59') SFSTAT
WHERE   PASS_DATETIME IS NOT NULL
GROUP BY ORG ,
        SKU_CODE ,
        CONVERT(DATE, CREATION_DATE, 101) ,
        SKU_NAME
HAVING  COUNT(UNIT) >= 100;

很高兴在这里学习优化。

【问题讨论】:

  • 看起来您的select columns list 是column names in group by 的较短版本,但应该相同
  • 那是我的错,他们是一样的
  • 也许你应该调整你的Table Valued Function
  • 表函数是什么样的?我会支持在那儿寻找性能改进的建议

标签: sql sql-server performance sql-server-2008 query-optimization


【解决方案1】:

据我所知,这是无法做到的,但您可以通过一个简单的子查询轻松避开该问题:

SELECT  ORG ,
        CreationDate ,
        SKU_CODE ,
        SKU_NAME ,
        COUNT(UNIT) AS Production
FROM (
    SELECT 
        ORG ,
        CONVERT(DATE, CREATION_DATE, 101) AS CreationDate,
        SKU_CODE ,
        SKU_NAME ,
        UNIT,
        PASS_DATETIME,
    FROM 
    dbo.abcd_efgh_ijk(123, 'abc', NULL, '10009', NULL,
                          '2014-11-01 00:00:00', '2014-11-30 23:59:59')
    ) SNMFT
WHERE   PASS_DATETIME IS NOT NULL
GROUP BY ORG ,
        SKU_CODE ,
        CreationDate,
        SKU_NAME
HAVING  COUNT(UNIT) >= 100;

【讨论】:

    猜你喜欢
    • 2017-04-12
    • 2014-09-18
    • 2012-09-06
    • 2018-10-28
    • 2010-12-22
    • 2021-03-15
    • 1970-01-01
    • 2013-09-17
    • 2019-10-07
    相关资源
    最近更新 更多