SQL Server 选择阶段/序列已丢失或不按顺序的位置

问题描述 投票:0回答:1

我有一张桌子,里面有

families_id
date
metric_id

为每个

families_id
插入一条记录,其中将有
date
metric_id
1-10。

因此,每个

families_id
应该有 10 条记录,插入的记录带有日期,并且每条记录都应相互关联。所以
metric_id
10 日期应该大于
metric_id
6 日期。

在弥撒中我如何选择他们所在的地方

  1. 错过了
    metric_id
  2. metric_id
    6 的日期早于
    metric_id
    2
  3. 的日期
sql sql-server select sequence stage
1个回答
2
投票

使用 row_number 为每个系列的 metric_id 和日期分配一个序数,然后它们应该匹配 - 另外 metric_id, 1,2,3,4... 应该与计算出的 row_number() 匹配,也是 1,2,3, 4....

SELECT IQ.* FROM (SELECT families_id, [date], metric_id, 
        ROW_NUMBER() OVER (PARTITION BY families_id ORDER BY [date]) rn_date,
        ROW_NUMBER() OVER (PARTITION BY families_id ORDER BY metricid) rn_metric FROM YourTable) IQ 
    WHERE IQ.rn_date != IQ.rn_metric;

--should detect wrongly ordered metric_ids
SELECT IQ.* FROM (SELECT families_id, [date], metric_id, 
        ROW_NUMBER() OVER (PARTITION BY families_id ORDER BY [date]) rn_date,
        ROW_NUMBER() OVER (PARTITION BY families_id ORDER BY metricid) rn_metric FROM YourTable) IQ 
    WHERE IQ.metric_id != IQ.rn_metric;

另一种可能性 - 检测 metricID,其中日期较早的 id 较高

    SELECT y1.families_id, y1.metric_id FROM yourtable y1
                    WHERE 
                    EXISTS(SELECT 0 FROM yourtable y2 WHERE y1.families_id = y2.families_id 
                                                            AND
                                                            y2.date < y1.date 
                                                            AND
                                                            y2.metricid > y1.metricid)
© www.soinside.com 2019 - 2024. All rights reserved.