说我有这样一张桌子:
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获得它,但后来我没有看到获得组数的方法。
有什么想法吗?
答案 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以来的毫秒数。算术表达式是一种更简单的转换为小时的方法。