在CTE中通过OR计数获得guid值?

时间:2017-12-12 16:31:32

标签: sql sql-server

说我有这样一张桌子:

category | guid    | date_create
---------+-----------------------
   A     | 5BC2... | 1513092309831
   A     | 6A1C... | 1513090067577
   B     | 92A2... | 1513089780272

我需要按小时制作一组,并保留每组我可以制作的数量

SELECT
MAX(guid),count(1) as count
    FROM feed f
    GROUP BY 
          category,
          DATEPART(YEAR, dateadd(S, f.date_create / 1000, '1970-01-01')),
          DATEPART(MONTH, dateadd(S, f.date_create / 1000, '1970-01-01')),
          DATEPART(DAY, dateadd(S, f.date_create / 1000, '1970-01-01')),
          DATEPART(HOUR, dateadd(S, f.date_create / 1000, '1970-01-01'))

我的问题在于我需要最新的guid(更高的date_create)而不是MIN()或MAX()......

我可以使用CTE获得它,但后来我没有看到获得组数的方法。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您可以使用CTE获取每个组的最新成员,然后在主查询中使用相关子查询来获取与该成员相同的组中的行数。

答案 1 :(得分:1)

按照@Tab Alleman的建议,我在CTE中做了以下内容以达到我想要的效果。

WITH f AS
(
     SELECT *,
         ROW_NUMBER() OVER
         (
             PARTITION BY userf, rowtype, DATEPART(YEAR, dateadd(S, f.date_create / 1000, '1970-01-01')),
      DATEPART(MONTH, dateadd(S, f.date_create / 1000, '1970-01-01')),
      DATEPART(DAY, dateadd(S, f.date_create / 1000, '1970-01-01')),
      DATEPART(HOUR, dateadd(S, f.date_create / 1000, '1970-01-01'))

             ORDER BY date_create desc
         ) AS Recency,
  count(*) over (PARTITION BY userf,rowtype, DATEPART(YEAR, dateadd(S, f.date_create / 1000, '1970-01-01')),
      DATEPART(MONTH, dateadd(S, f.date_create / 1000, '1970-01-01')),
      DATEPART(DAY, dateadd(S, f.date_create / 1000, '1970-01-01')),
      DATEPART(HOUR, dateadd(S, f.date_create / 1000, '1970-01-01'))) as cnt
     FROM feed f
)

答案 2 :(得分:0)

我想你想要:

SELECT f.*
FROM (SELECT f.*, COUNT(*) OVER (PARTITION BY category, f.date_create / (1000 * 60 * 60)) as cnt,
             ROW_NUMBER() OVER (PARTITION BY category, f.date_create / (1000 * 60 * 60)
                                ORER BY f.date_create DESC
                               ) as seqnum
      FROM feed f
     ) f
WHERE seqnum = 1;

据推测,date_create是自1970-01-01以来的毫秒数。算术表达式是一种更简单的转换为小时的方法。