Sql 按顺序或CTE中的组计数获取guid值?

Sql 按顺序或CTE中的组计数获取guid值?,sql,sql-server,Sql,Sql Server,假设我有一张这样的桌子: category | guid | date_create ---------+----------------------- A | 5BC2... | 1513092309831 A | 6A1C... | 1513090067577 B | 92A2... | 1513089780272 我需要按小时分组,并记下我能做的每一组的数量 SELECT MAX(guid),count(1) as count FR

假设我有一张这样的桌子:

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(创建日期更高),而不是MIN()或MAX()

我可以使用CTE获得它,但是我看不到一种获得组数的方法

有什么想法吗?

我想你想要:

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\u create
是自1970-01-01以来的毫秒数。算术表达式是转换为小时的更简单的方法。

我想您需要:

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\u create
是自1970-01-01以来的毫秒数。算术表达式是转换为小时的更简单方法。

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

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

遵循@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
)

根据@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
)

基于样本数据的期望输出是什么?基于样本数据的期望输出是什么?这会产生一个组计数?这会产生一个组计数?按照你的建议,我用下面的代码实现了期望的结果。按照你的建议,我用下面的代码实现了期望的结果。