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